redux-saga
Version:
Saga middleware for Redux to handle Side Effects
45 lines (40 loc) • 1.41 kB
JavaScript
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 + ')');
}