import fsmIterator, { qEnd, safeName } from './fsmIterator'; import { cancel, take, fork } from '../io'; import { END } from '../channel'; export default function takeLatest(patternOrChannel, worker) { for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } var yTake = { done: false, value: take(patternOrChannel) }; var yFork = function yFork(ac) { return { done: false, value: fork.apply(undefined, [worker].concat(args, [ac])) }; }; var yCancel = function yCancel(task) { return { done: false, value: cancel(task) }; }; var task = void 0, action = void 0; var setTask = function setTask(t) { return task = t; }; var setAction = function setAction(ac) { return action = ac; }; return fsmIterator({ q1: function q1() { return ['q2', yTake, setAction]; }, q2: function q2() { return action === END ? [qEnd] : task ? ['q3', yCancel(task)] : ['q1', yFork(action), setTask]; }, q3: function q3() { return ['q1', yFork(action), setTask]; } }, 'q1', 'takeLatest(' + safeName(patternOrChannel) + ', ' + worker.name + ')'); }