UNPKG

2.46 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.buffers = exports.BUFFER_OVERFLOW = undefined;
5
6var _utils = require("./utils");
7
8var BUFFER_OVERFLOW = exports.BUFFER_OVERFLOW = "Channel's Buffer overflow!";
9
10var ON_OVERFLOW_THROW = 1;
11var ON_OVERFLOW_DROP = 2;
12var ON_OVERFLOW_SLIDE = 3;
13var ON_OVERFLOW_EXPAND = 4;
14
15var zeroBuffer = { isEmpty: _utils.kTrue, put: _utils.noop, take: _utils.noop };
16
17function ringBuffer() {
18 var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10;
19 var overflowAction = arguments[1];
20
21 var arr = new Array(limit);
22 var length = 0;
23 var pushIndex = 0;
24 var popIndex = 0;
25
26 var push = function push(it) {
27 arr[pushIndex] = it;
28 pushIndex = (pushIndex + 1) % limit;
29 length++;
30 };
31
32 var take = function take() {
33 if (length != 0) {
34 var it = arr[popIndex];
35 arr[popIndex] = null;
36 length--;
37 popIndex = (popIndex + 1) % limit;
38 return it;
39 }
40 };
41
42 var flush = function flush() {
43 var items = [];
44 while (length) {
45 items.push(take());
46 }
47 return items;
48 };
49
50 return {
51 isEmpty: function isEmpty() {
52 return length == 0;
53 },
54 put: function put(it) {
55 if (length < limit) {
56 push(it);
57 } else {
58 var doubledLimit = void 0;
59 switch (overflowAction) {
60 case ON_OVERFLOW_THROW:
61 throw new Error(BUFFER_OVERFLOW);
62 case ON_OVERFLOW_SLIDE:
63 arr[pushIndex] = it;
64 pushIndex = (pushIndex + 1) % limit;
65 popIndex = pushIndex;
66 break;
67 case ON_OVERFLOW_EXPAND:
68 doubledLimit = 2 * limit;
69
70 arr = flush();
71
72 length = arr.length;
73 pushIndex = arr.length;
74 popIndex = 0;
75
76 arr.length = doubledLimit;
77 limit = doubledLimit;
78
79 push(it);
80 break;
81 default:
82 // DROP
83 }
84 }
85 },
86 take: take,
87 flush: flush
88 };
89}
90
91var buffers = exports.buffers = {
92 none: function none() {
93 return zeroBuffer;
94 },
95 fixed: function fixed(limit) {
96 return ringBuffer(limit, ON_OVERFLOW_THROW);
97 },
98 dropping: function dropping(limit) {
99 return ringBuffer(limit, ON_OVERFLOW_DROP);
100 },
101 sliding: function sliding(limit) {
102 return ringBuffer(limit, ON_OVERFLOW_SLIDE);
103 },
104 expanding: function expanding(initialSize) {
105 return ringBuffer(initialSize, ON_OVERFLOW_EXPAND);
106 }
107};
\No newline at end of file