1 | "use strict";
|
2 |
|
3 | exports.__esModule = true;
|
4 | exports.buffers = exports.BUFFER_OVERFLOW = undefined;
|
5 |
|
6 | var _utils = require("./utils");
|
7 |
|
8 | var BUFFER_OVERFLOW = exports.BUFFER_OVERFLOW = "Channel's Buffer overflow!";
|
9 |
|
10 | var ON_OVERFLOW_THROW = 1;
|
11 | var ON_OVERFLOW_DROP = 2;
|
12 | var ON_OVERFLOW_SLIDE = 3;
|
13 | var ON_OVERFLOW_EXPAND = 4;
|
14 |
|
15 | var zeroBuffer = { isEmpty: _utils.kTrue, put: _utils.noop, take: _utils.noop };
|
16 |
|
17 | function 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 |
|
83 | }
|
84 | }
|
85 | },
|
86 | take: take,
|
87 | flush: flush
|
88 | };
|
89 | }
|
90 |
|
91 | var 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 |