redux-saga
Version:
Saga middleware for Redux to handle Side Effects
102 lines (88 loc) • 2.31 kB
JavaScript
import { kTrue, noop } from './utils';
export var BUFFER_OVERFLOW = "Channel's Buffer overflow!";
var ON_OVERFLOW_THROW = 1;
var ON_OVERFLOW_DROP = 2;
var ON_OVERFLOW_SLIDE = 3;
var ON_OVERFLOW_EXPAND = 4;
var zeroBuffer = { isEmpty: kTrue, put: noop, take: noop };
function ringBuffer() {
var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
var overflowAction = arguments[1];
var arr = new Array(limit);
var length = 0;
var pushIndex = 0;
var popIndex = 0;
var push = function push(it) {
arr[pushIndex] = it;
pushIndex = (pushIndex + 1) % limit;
length++;
};
var take = function take() {
if (length != 0) {
var it = arr[popIndex];
arr[popIndex] = null;
length--;
popIndex = (popIndex + 1) % limit;
return it;
}
};
var flush = function flush() {
var items = [];
while (length) {
items.push(take());
}
return items;
};
return {
isEmpty: function isEmpty() {
return length == 0;
},
put: function put(it) {
if (length < limit) {
push(it);
} else {
var doubledLimit = void 0;
switch (overflowAction) {
case ON_OVERFLOW_THROW:
throw new Error(BUFFER_OVERFLOW);
case ON_OVERFLOW_SLIDE:
arr[pushIndex] = it;
pushIndex = (pushIndex + 1) % limit;
popIndex = pushIndex;
break;
case ON_OVERFLOW_EXPAND:
doubledLimit = 2 * limit;
arr = flush();
length = arr.length;
pushIndex = arr.length;
popIndex = 0;
arr.length = doubledLimit;
limit = doubledLimit;
push(it);
break;
default:
// DROP
}
}
},
take: take,
flush: flush
};
}
export var buffers = {
none: function none() {
return zeroBuffer;
},
fixed: function fixed(limit) {
return ringBuffer(limit, ON_OVERFLOW_THROW);
},
dropping: function dropping(limit) {
return ringBuffer(limit, ON_OVERFLOW_DROP);
},
sliding: function sliding(limit) {
return ringBuffer(limit, ON_OVERFLOW_SLIDE);
},
expanding: function expanding(initialSize) {
return ringBuffer(initialSize, ON_OVERFLOW_EXPAND);
}
};