You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.4 KiB
107 lines
2.4 KiB
"use strict";
|
|
|
|
exports.__esModule = true;
|
|
exports.buffers = exports.BUFFER_OVERFLOW = undefined;
|
|
|
|
var _utils = /*#__PURE__*/require("./utils");
|
|
|
|
var BUFFER_OVERFLOW = exports.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: _utils.kTrue, put: _utils.noop, take: _utils.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
|
|
};
|
|
}
|
|
|
|
var buffers = exports.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);
|
|
}
|
|
}; |