import fsmIterator, { qEnd, safeName } from './fsmIterator'; import { take, fork, actionChannel, call } from '../io'; import { END } from '../channel'; import { buffers } from '../buffers'; import { delay } from '../utils'; export default function throttle(delayLength, pattern, worker) { for (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) { args[_key - 3] = arguments[_key]; } var action = void 0, channel = void 0; var yActionChannel = { done: false, value: actionChannel(pattern, buffers.sliding(1)) }; var yTake = function yTake() { return { done: false, value: take(channel) }; }; var yFork = function yFork(ac) { return { done: false, value: fork.apply(undefined, [worker].concat(args, [ac])) }; }; var yDelay = { done: false, value: call(delay, delayLength) }; var setAction = function setAction(ac) { return action = ac; }; var setChannel = function setChannel(ch) { return channel = ch; }; return fsmIterator({ q1: function q1() { return ['q2', yActionChannel, setChannel]; }, q2: function q2() { return ['q3', yTake(), setAction]; }, q3: function q3() { return action === END ? [qEnd] : ['q4', yFork(action)]; }, q4: function q4() { return ['q2', yDelay]; } }, 'q1', 'throttle(' + safeName(pattern) + ', ' + worker.name + ')'); }