fastds 0.0.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +83 -0
- package/build/binary-search.cjs +95 -0
- package/build/binary-search.cjs.map +1 -0
- package/build/binary-search.d.ts +20 -0
- package/build/binary-search.js +85 -0
- package/build/binary-search.js.map +1 -0
- package/build/index.cjs +22 -0
- package/build/index.cjs.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +4 -0
- package/build/index.js.map +1 -0
- package/build/ring-buffer.cjs +469 -0
- package/build/ring-buffer.cjs.map +1 -0
- package/build/ring-buffer.d.ts +40 -0
- package/build/ring-buffer.js +459 -0
- package/build/ring-buffer.js.map +1 -0
- package/package.json +50 -0
- package/src/index.ts +3 -0
- package/src/ring-buffer.ts +526 -0
@@ -0,0 +1,469 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
3
|
+
value: true
|
4
|
+
});
|
5
|
+
Object.defineProperty(exports, "RingBuffer", {
|
6
|
+
enumerable: true,
|
7
|
+
get: function() {
|
8
|
+
return RingBuffer;
|
9
|
+
}
|
10
|
+
});
|
11
|
+
const DEFAULT_CAPACITY = 8;
|
12
|
+
class RingBuffer {
|
13
|
+
#buffer;
|
14
|
+
#head = 0;
|
15
|
+
#tail = 0;
|
16
|
+
#mask;
|
17
|
+
#length = 0;
|
18
|
+
static from(values) {
|
19
|
+
const n = values.length;
|
20
|
+
const ring = new RingBuffer(n);
|
21
|
+
for(let i = 0; i < n; i++){
|
22
|
+
ring.#buffer[i] = values[i];
|
23
|
+
}
|
24
|
+
ring.#head = 0;
|
25
|
+
ring.#tail = n;
|
26
|
+
ring.#length = n;
|
27
|
+
return ring;
|
28
|
+
}
|
29
|
+
[Symbol.toStringTag] = 'RingBuffer';
|
30
|
+
constructor(capacity = DEFAULT_CAPACITY){
|
31
|
+
const size = Math.max(1 << 32 - Math.clz32(capacity), DEFAULT_CAPACITY);
|
32
|
+
this.#buffer = new Array(size);
|
33
|
+
this.#mask = size - 1;
|
34
|
+
}
|
35
|
+
get capacity() {
|
36
|
+
return this.#mask + 1;
|
37
|
+
}
|
38
|
+
get length() {
|
39
|
+
return this.#length;
|
40
|
+
}
|
41
|
+
isEmpty() {
|
42
|
+
return this.#tail === this.#head;
|
43
|
+
}
|
44
|
+
isWrapped() {
|
45
|
+
return this.#head > this.#tail;
|
46
|
+
}
|
47
|
+
getHeadOffset(index) {
|
48
|
+
return this.#head + index & this.#mask;
|
49
|
+
}
|
50
|
+
getTailOffset(index) {
|
51
|
+
return this.#tail + index & this.#mask;
|
52
|
+
}
|
53
|
+
grow(capacity = this.#mask + 1) {
|
54
|
+
const buffer = this.#buffer;
|
55
|
+
const bufferLength = buffer.length;
|
56
|
+
if (bufferLength >= capacity + 1) {
|
57
|
+
return;
|
58
|
+
}
|
59
|
+
const size = 1 << 32 - Math.clz32(capacity);
|
60
|
+
this.#buffer.length = size;
|
61
|
+
const oldTail = this.#tail;
|
62
|
+
if (oldTail < this.#head) {
|
63
|
+
const buffer = this.#buffer;
|
64
|
+
for(let i = 0; i < oldTail; i++){
|
65
|
+
buffer[bufferLength + i] = buffer[i];
|
66
|
+
}
|
67
|
+
this.#tail = bufferLength + oldTail;
|
68
|
+
}
|
69
|
+
this.#mask = size - 1;
|
70
|
+
}
|
71
|
+
allocate(index, count) {
|
72
|
+
const prevLength = this.#length;
|
73
|
+
if (index < 0 || index > prevLength || count <= 0) {
|
74
|
+
return false;
|
75
|
+
}
|
76
|
+
const buffer = this.#buffer;
|
77
|
+
const head = this.#head;
|
78
|
+
const tail = this.#tail;
|
79
|
+
const prevMask = this.#mask;
|
80
|
+
const nextLength = count + prevLength;
|
81
|
+
const wrapIndex = buffer.length - head;
|
82
|
+
const isWrapped = head > tail;
|
83
|
+
if (nextLength >= buffer.length) {
|
84
|
+
const size = 1 << 32 - Math.clz32(nextLength);
|
85
|
+
buffer.length = size;
|
86
|
+
this.#mask = size - 1;
|
87
|
+
}
|
88
|
+
const mask = this.#mask;
|
89
|
+
const isResized = prevMask !== mask;
|
90
|
+
const leftMoveCount = index;
|
91
|
+
const rightMoveCount = prevLength - index;
|
92
|
+
if (leftMoveCount < rightMoveCount) {
|
93
|
+
if (isResized && isWrapped) {
|
94
|
+
for(let i = 0; i < tail; i++){
|
95
|
+
const read = i;
|
96
|
+
const write = head + wrapIndex + i & mask;
|
97
|
+
buffer[write] = buffer[read];
|
98
|
+
buffer[read] = undefined;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
const writeBase = head - count & mask;
|
102
|
+
for(let i = 0; i < leftMoveCount; i++){
|
103
|
+
const read = head + i & mask;
|
104
|
+
const write = writeBase + i & mask;
|
105
|
+
buffer[write] = buffer[read];
|
106
|
+
buffer[read] = undefined;
|
107
|
+
}
|
108
|
+
this.#head = writeBase;
|
109
|
+
} else {
|
110
|
+
if (isResized && isWrapped) {
|
111
|
+
for(let i = 0; i < tail; i++){
|
112
|
+
const read = i;
|
113
|
+
const write = head + wrapIndex + i & mask;
|
114
|
+
buffer[write] = buffer[read];
|
115
|
+
buffer[read] = undefined;
|
116
|
+
}
|
117
|
+
}
|
118
|
+
for(let i = rightMoveCount - 1; i >= 0; i--){
|
119
|
+
const read = head + index + i & mask;
|
120
|
+
const write = head + index + count + i & mask;
|
121
|
+
buffer[write] = buffer[read];
|
122
|
+
buffer[read] = undefined;
|
123
|
+
}
|
124
|
+
this.#tail = head + nextLength & mask;
|
125
|
+
}
|
126
|
+
this.#length = nextLength;
|
127
|
+
return true;
|
128
|
+
}
|
129
|
+
deallocate(index, count) {
|
130
|
+
const prevLength = this.#length;
|
131
|
+
if (index < 0 || index >= prevLength || count <= 0) {
|
132
|
+
return false;
|
133
|
+
}
|
134
|
+
const actualCount = Math.min(count, prevLength - index);
|
135
|
+
const nextLength = prevLength - actualCount;
|
136
|
+
const buffer = this.#buffer;
|
137
|
+
const head = this.#head;
|
138
|
+
const tail = this.#tail;
|
139
|
+
const mask = this.#mask;
|
140
|
+
if (index === 0) {
|
141
|
+
for(let i = 0; i < actualCount; i++){
|
142
|
+
buffer[head + i & mask] = undefined;
|
143
|
+
}
|
144
|
+
this.#head = head + actualCount & mask;
|
145
|
+
this.#length = nextLength;
|
146
|
+
return true;
|
147
|
+
}
|
148
|
+
if (index + actualCount === prevLength) {
|
149
|
+
for(let i = 0; i < actualCount; i++){
|
150
|
+
buffer[tail - i - 1 & mask] = undefined;
|
151
|
+
}
|
152
|
+
this.#tail = tail - actualCount & mask;
|
153
|
+
this.#length = nextLength;
|
154
|
+
return true;
|
155
|
+
}
|
156
|
+
const leftMoveCount = index;
|
157
|
+
const rightMoveCount = prevLength - index - actualCount;
|
158
|
+
if (leftMoveCount < rightMoveCount) {
|
159
|
+
for(let i = leftMoveCount - 1; i >= 0; i--){
|
160
|
+
const read = head + i & mask;
|
161
|
+
const write = head + i + actualCount & mask;
|
162
|
+
buffer[write] = buffer[read];
|
163
|
+
}
|
164
|
+
for(let i = 0; i < actualCount; i++){
|
165
|
+
buffer[head + i & mask] = undefined;
|
166
|
+
}
|
167
|
+
this.#head = head + actualCount & mask;
|
168
|
+
} else {
|
169
|
+
for(let i = 0; i < rightMoveCount; i++){
|
170
|
+
const read = head + index + actualCount + i & mask;
|
171
|
+
const write = head + index + i & mask;
|
172
|
+
buffer[write] = buffer[read];
|
173
|
+
}
|
174
|
+
this.#tail = tail - actualCount & mask;
|
175
|
+
for(let i = 0; i < actualCount; i++){
|
176
|
+
buffer[tail + i & mask] = undefined;
|
177
|
+
}
|
178
|
+
}
|
179
|
+
this.#length = nextLength;
|
180
|
+
return true;
|
181
|
+
}
|
182
|
+
indexOf(value, index = 0) {
|
183
|
+
const length = this.#length;
|
184
|
+
const buffer = this.#buffer;
|
185
|
+
const head = this.#head;
|
186
|
+
const tail = this.#tail;
|
187
|
+
if (head < tail) {
|
188
|
+
const offset = head + index;
|
189
|
+
const result = buffer.indexOf(value, offset);
|
190
|
+
if (result !== -1 && result < tail) {
|
191
|
+
return result - head;
|
192
|
+
}
|
193
|
+
return -1;
|
194
|
+
}
|
195
|
+
const capacity = buffer.length;
|
196
|
+
const firstSegmentLength = capacity - head;
|
197
|
+
if (index < firstSegmentLength) {
|
198
|
+
const startOffset = head + index;
|
199
|
+
const result = buffer.indexOf(value, startOffset);
|
200
|
+
if (result !== -1) {
|
201
|
+
return result - head;
|
202
|
+
}
|
203
|
+
index = firstSegmentLength;
|
204
|
+
}
|
205
|
+
if (index < length) {
|
206
|
+
if (tail > length / 2) {
|
207
|
+
const result = buffer.indexOf(value);
|
208
|
+
if (result !== -1 && result < tail) {
|
209
|
+
return firstSegmentLength + result;
|
210
|
+
}
|
211
|
+
} else {
|
212
|
+
for(let i = 0; i < tail; i++){
|
213
|
+
if (buffer[i] === value) {
|
214
|
+
return firstSegmentLength + i;
|
215
|
+
}
|
216
|
+
}
|
217
|
+
}
|
218
|
+
}
|
219
|
+
return -1;
|
220
|
+
}
|
221
|
+
unwrap() {
|
222
|
+
if (this.isEmpty()) {
|
223
|
+
return false;
|
224
|
+
}
|
225
|
+
const length = this.#length;
|
226
|
+
const buffer = this.#buffer;
|
227
|
+
const prevHead = this.#head;
|
228
|
+
const prevTail = this.#tail;
|
229
|
+
if (prevHead > prevTail) {
|
230
|
+
const bufferLength = buffer.length;
|
231
|
+
buffer.length = bufferLength + prevTail;
|
232
|
+
for(let i = 0; i < prevTail; i++){
|
233
|
+
buffer[bufferLength + i] = buffer[i];
|
234
|
+
buffer[i] = undefined;
|
235
|
+
}
|
236
|
+
}
|
237
|
+
for(let i = 0; i < length; i++){
|
238
|
+
buffer[i] = buffer[prevHead + i];
|
239
|
+
}
|
240
|
+
buffer.length = this.#mask + 1;
|
241
|
+
this.#head = 0;
|
242
|
+
this.#tail = length;
|
243
|
+
this.#length = length;
|
244
|
+
return true;
|
245
|
+
}
|
246
|
+
compact(filter) {
|
247
|
+
if (this.isEmpty()) {
|
248
|
+
return false;
|
249
|
+
}
|
250
|
+
const length = this.#length;
|
251
|
+
const buffer = this.#buffer;
|
252
|
+
const head = this.#head;
|
253
|
+
const mask = this.#mask;
|
254
|
+
let bufferLength = buffer.length;
|
255
|
+
let write = 0;
|
256
|
+
for(let read = 0; read < length; read++){
|
257
|
+
const readOffset = head + read & mask;
|
258
|
+
const value = buffer[readOffset];
|
259
|
+
if (filter(value, read)) {
|
260
|
+
if (read !== write) {
|
261
|
+
const writeOffset = head + write & mask;
|
262
|
+
buffer[writeOffset] = value;
|
263
|
+
}
|
264
|
+
write++;
|
265
|
+
}
|
266
|
+
}
|
267
|
+
if (write === length) {
|
268
|
+
return false;
|
269
|
+
}
|
270
|
+
if (write < bufferLength / 2) {
|
271
|
+
const size = 1 << 32 - Math.clz32(write - 1);
|
272
|
+
buffer.length = size;
|
273
|
+
bufferLength = size;
|
274
|
+
}
|
275
|
+
for(let i = write; i < bufferLength; i++){
|
276
|
+
buffer[i] = undefined;
|
277
|
+
}
|
278
|
+
this.#head = 0;
|
279
|
+
this.#tail = write;
|
280
|
+
this.#length = write;
|
281
|
+
return true;
|
282
|
+
}
|
283
|
+
push(value) {
|
284
|
+
const tail = this.getTailOffset(1);
|
285
|
+
if (tail === this.#head) {
|
286
|
+
this.grow(this.#mask + 2);
|
287
|
+
}
|
288
|
+
this.#buffer[this.#tail] = value;
|
289
|
+
this.#tail = this.getTailOffset(1);
|
290
|
+
this.#length++;
|
291
|
+
return this;
|
292
|
+
}
|
293
|
+
unshift(value) {
|
294
|
+
const head = this.getHeadOffset(-1);
|
295
|
+
if (head === this.#tail) {
|
296
|
+
this.grow(this.#mask + 2);
|
297
|
+
}
|
298
|
+
this.#head = this.getHeadOffset(-1);
|
299
|
+
this.#buffer[this.#head] = value;
|
300
|
+
this.#length++;
|
301
|
+
return this;
|
302
|
+
}
|
303
|
+
shift() {
|
304
|
+
if (this.#head === this.#tail) {
|
305
|
+
return undefined;
|
306
|
+
}
|
307
|
+
const value = this.#buffer[this.#head];
|
308
|
+
this.#buffer[this.#head] = undefined;
|
309
|
+
this.#head = this.getHeadOffset(1);
|
310
|
+
this.#length--;
|
311
|
+
return value;
|
312
|
+
}
|
313
|
+
pop() {
|
314
|
+
if (this.#head === this.#tail) {
|
315
|
+
return undefined;
|
316
|
+
}
|
317
|
+
this.#tail = this.getTailOffset(-1);
|
318
|
+
const value = this.#buffer[this.#tail];
|
319
|
+
this.#buffer[this.#tail] = undefined;
|
320
|
+
this.#length--;
|
321
|
+
return value;
|
322
|
+
}
|
323
|
+
peekAt(index) {
|
324
|
+
if (index < 0 || index >= this.#length) {
|
325
|
+
return undefined;
|
326
|
+
}
|
327
|
+
const offset = this.getHeadOffset(index);
|
328
|
+
return this.#buffer[offset];
|
329
|
+
}
|
330
|
+
peekFirst() {
|
331
|
+
return this.#buffer[this.#head];
|
332
|
+
}
|
333
|
+
peekLast() {
|
334
|
+
const offset = this.getTailOffset(-1);
|
335
|
+
return this.#buffer[offset];
|
336
|
+
}
|
337
|
+
has(value) {
|
338
|
+
return this.indexOf(value) !== -1;
|
339
|
+
}
|
340
|
+
insertOne(index, value) {
|
341
|
+
this.allocate(index, 1);
|
342
|
+
this.#buffer[this.#head + index & this.#mask] = value;
|
343
|
+
return index;
|
344
|
+
}
|
345
|
+
insert(index, values) {
|
346
|
+
const length = values.length;
|
347
|
+
const writeBase = this.#head + index;
|
348
|
+
this.allocate(index, length);
|
349
|
+
for(let i = 0; i < length; i++){
|
350
|
+
this.#buffer[writeBase + i & this.#mask] = values[i];
|
351
|
+
}
|
352
|
+
return index;
|
353
|
+
}
|
354
|
+
removeOne(index) {
|
355
|
+
const length = this.#length;
|
356
|
+
if (index < 0 || index >= length) {
|
357
|
+
return -1;
|
358
|
+
}
|
359
|
+
const buffer = this.#buffer;
|
360
|
+
const mask = this.#mask;
|
361
|
+
const head = this.#head;
|
362
|
+
const leftMoveCount = index;
|
363
|
+
const rightMoveCount = length - index;
|
364
|
+
if (leftMoveCount < rightMoveCount) {
|
365
|
+
for(let i = index; i > 0; i--){
|
366
|
+
buffer[head + i & mask] = buffer[head + i - 1 & mask];
|
367
|
+
}
|
368
|
+
buffer[head] = undefined;
|
369
|
+
this.#head = head + 1 & mask;
|
370
|
+
} else {
|
371
|
+
for(let i = index; i < length - 1; i++){
|
372
|
+
buffer[head + i & mask] = buffer[head + i + 1 & mask];
|
373
|
+
}
|
374
|
+
const tail = head + length - 1 & mask;
|
375
|
+
buffer[tail] = undefined;
|
376
|
+
this.#tail = tail;
|
377
|
+
}
|
378
|
+
this.#length = length - 1;
|
379
|
+
return index;
|
380
|
+
}
|
381
|
+
removeFirst(value, index = 0) {
|
382
|
+
const foundIndex = this.indexOf(value, index);
|
383
|
+
if (foundIndex === -1) {
|
384
|
+
return -1;
|
385
|
+
}
|
386
|
+
return this.removeOne(foundIndex);
|
387
|
+
}
|
388
|
+
remove(index, count) {
|
389
|
+
const result = this.slice(index, count);
|
390
|
+
this.deallocate(index, count);
|
391
|
+
return result;
|
392
|
+
}
|
393
|
+
clear() {
|
394
|
+
this.#buffer.length = 0;
|
395
|
+
this.#buffer.length = DEFAULT_CAPACITY;
|
396
|
+
this.#head = 0;
|
397
|
+
this.#tail = 0;
|
398
|
+
this.#length = 0;
|
399
|
+
this.#mask = DEFAULT_CAPACITY - 1;
|
400
|
+
return this;
|
401
|
+
}
|
402
|
+
slice(start = 0, end = this.#length) {
|
403
|
+
const length = this.#length;
|
404
|
+
const buffer = this.#buffer;
|
405
|
+
const head = this.#head;
|
406
|
+
const tail = this.#tail;
|
407
|
+
const mask = this.#mask;
|
408
|
+
const actualStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);
|
409
|
+
const actualEnd = end < 0 ? Math.max(length + end, 0) : Math.min(end, length);
|
410
|
+
if (head <= tail) {
|
411
|
+
return this.#buffer.slice(head + actualStart & mask, head + actualEnd & mask);
|
412
|
+
}
|
413
|
+
const size = Math.max(actualEnd - actualStart, 0);
|
414
|
+
const result = new Array(size);
|
415
|
+
for(let i = 0; i < size; i++){
|
416
|
+
result[i] = buffer[head + actualStart + i & mask];
|
417
|
+
}
|
418
|
+
return result;
|
419
|
+
}
|
420
|
+
toArray() {
|
421
|
+
return this.slice();
|
422
|
+
}
|
423
|
+
drain() {
|
424
|
+
return Iterator.from({
|
425
|
+
[Symbol.iterator]: ()=>{
|
426
|
+
return {
|
427
|
+
next: ()=>{
|
428
|
+
if (this.#length === 0) {
|
429
|
+
return {
|
430
|
+
done: true,
|
431
|
+
value: undefined
|
432
|
+
};
|
433
|
+
}
|
434
|
+
const value = this.shift();
|
435
|
+
return {
|
436
|
+
done: false,
|
437
|
+
value
|
438
|
+
};
|
439
|
+
}
|
440
|
+
};
|
441
|
+
}
|
442
|
+
});
|
443
|
+
}
|
444
|
+
iter() {
|
445
|
+
return Iterator.from(this[Symbol.iterator]());
|
446
|
+
}
|
447
|
+
[Symbol.iterator]() {
|
448
|
+
const buffer = this.#buffer;
|
449
|
+
let idx = this.#head;
|
450
|
+
return {
|
451
|
+
next: ()=>{
|
452
|
+
if (idx >= this.#head + this.#length) {
|
453
|
+
return {
|
454
|
+
done: true,
|
455
|
+
value: undefined
|
456
|
+
};
|
457
|
+
}
|
458
|
+
const offset = idx++ & this.#mask;
|
459
|
+
const value = buffer[offset];
|
460
|
+
return {
|
461
|
+
done: false,
|
462
|
+
value
|
463
|
+
};
|
464
|
+
}
|
465
|
+
};
|
466
|
+
}
|
467
|
+
}
|
468
|
+
|
469
|
+
//# sourceMappingURL=ring-buffer.cjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/ring-buffer.ts"],"sourcesContent":["const DEFAULT_CAPACITY = 8;\n\nexport interface FilterFunction<T> {\n (value: T, index: number): boolean;\n}\n\nexport class RingBuffer<T> {\n #buffer: Array<T | undefined>;\n #head = 0;\n #tail = 0;\n #mask: number;\n #length = 0;\n\n static from<T>(values: T[]): RingBuffer<T> {\n const n = values.length;\n const ring = new RingBuffer<T>(n);\n for (let i = 0; i < n; i++) {\n ring.#buffer[i] = values[i];\n }\n ring.#head = 0;\n ring.#tail = n;\n ring.#length = n;\n\n return ring;\n }\n\n readonly [Symbol.toStringTag] = 'RingBuffer';\n\n constructor(capacity: number = DEFAULT_CAPACITY) {\n const size = Math.max(1 << (32 - Math.clz32(capacity)), DEFAULT_CAPACITY);\n this.#buffer = new Array<T>(size);\n this.#mask = size - 1;\n }\n\n\n get capacity() {\n return this.#mask + 1;\n }\n\n get length() {\n return this.#length;\n }\n\n isEmpty(): boolean {\n return this.#tail === this.#head;\n }\n\n isWrapped(): boolean {\n return this.#head > this.#tail;\n }\n\n getHeadOffset(index: number): number {\n return (this.#head + index) & this.#mask;\n }\n\n getTailOffset(index: number): number {\n return (this.#tail + index) & this.#mask;\n }\n\n grow(capacity: number = this.#mask + 1): void {\n const buffer = this.#buffer;\n const bufferLength = buffer.length;\n if (bufferLength >= capacity + 1) {\n return;\n }\n const size = 1 << (32 - Math.clz32(capacity));\n this.#buffer.length = size;\n\n const oldTail = this.#tail;\n if (oldTail < this.#head) {\n const buffer = this.#buffer;\n for (let i = 0; i < oldTail; i++) {\n buffer[bufferLength + i] = buffer[i];\n }\n this.#tail = bufferLength + oldTail;\n }\n\n this.#mask = size - 1;\n }\n\n allocate(index: number, count: number): boolean {\n const prevLength = this.#length;\n if (index < 0 || index > prevLength || count <= 0) {\n return false;\n }\n\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n const prevMask = this.#mask;\n\n const nextLength = count + prevLength;\n const wrapIndex = buffer.length - head;\n const isWrapped = head > tail;\n\n if (nextLength >= buffer.length) {\n const size = 1 << (32 - Math.clz32(nextLength));\n buffer.length = size;\n this.#mask = size - 1;\n }\n\n const mask = this.#mask;\n const isResized = prevMask !== mask;\n\n const leftMoveCount = index;\n const rightMoveCount = prevLength - index;\n\n if (leftMoveCount < rightMoveCount) {\n if (isResized && isWrapped) {\n for (let i = 0; i < tail; i++) {\n const read = i;\n const write = (head + wrapIndex + i) & mask;\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n }\n const writeBase = (head - count) & mask;\n for (let i = 0; i < leftMoveCount; i++) {\n const read = (head + i) & mask;\n const write = (writeBase + i) & mask;\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n this.#head = writeBase;\n } else {\n if (isResized && isWrapped) {\n for (let i = 0; i < tail; i++) {\n const read = i;\n const write = (head + wrapIndex + i) & mask;\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n }\n\n for (let i = rightMoveCount - 1; i >= 0; i--) {\n const read = (head + index + i) & mask;\n const write = (head + index + count + i) & mask;\n\n buffer[write] = buffer[read];\n buffer[read] = undefined;\n }\n\n this.#tail = (head + nextLength) & mask;\n }\n\n this.#length = nextLength;\n return true;\n }\n\n deallocate(index: number, count: number): boolean {\n const prevLength = this.#length;\n if (index < 0 || index >= prevLength || count <= 0) {\n return false;\n }\n\n const actualCount = Math.min(count, prevLength - index);\n const nextLength = prevLength - actualCount;\n\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n const mask = this.#mask;\n\n if (index === 0) {\n for (let i = 0; i < actualCount; i++) {\n buffer[(head + i) & mask] = undefined;\n }\n this.#head = (head + actualCount) & mask;\n this.#length = nextLength;\n return true;\n }\n\n if (index + actualCount === prevLength) {\n for (let i = 0; i < actualCount; i++) {\n buffer[(tail - i - 1) & mask] = undefined;\n }\n this.#tail = (tail - actualCount) & mask;\n this.#length = nextLength;\n return true;\n }\n\n const leftMoveCount = index;\n const rightMoveCount = prevLength - index - actualCount;\n\n if (leftMoveCount < rightMoveCount) {\n for (let i = leftMoveCount - 1; i >= 0; i--) {\n const read = (head + i) & mask;\n const write = (head + i + actualCount) & mask;\n buffer[write] = buffer[read];\n }\n for (let i = 0; i < actualCount; i++) {\n buffer[(head + i) & mask] = undefined;\n }\n this.#head = (head + actualCount) & mask;\n } else {\n for (let i = 0; i < rightMoveCount; i++) {\n const read = (head + index + actualCount + i) & mask;\n const write = (head + index + i) & mask;\n buffer[write] = buffer[read];\n }\n this.#tail = (tail - actualCount) & mask;\n for (let i = 0; i < actualCount; i++) {\n buffer[(tail + i) & mask] = undefined;\n }\n }\n\n this.#length = nextLength;\n return true;\n }\n\n indexOf(value: T, index: number = 0): number {\n const length = this.#length;\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n\n if (head < tail) {\n const offset = head + index;\n const result = buffer.indexOf(value, offset);\n if (result !== -1 && result < tail) {\n return result - head;\n }\n return -1;\n }\n const capacity = buffer.length;\n const firstSegmentLength = capacity - head;\n\n if (index < firstSegmentLength) {\n const startOffset = head + index;\n const result = buffer.indexOf(value, startOffset);\n if (result !== -1) {\n return result - head;\n }\n index = firstSegmentLength;\n }\n\n if (index < length) {\n if (tail > length / 2) {\n const result = buffer.indexOf(value);\n if (result !== -1 && result < tail) {\n return firstSegmentLength + result;\n }\n } else {\n for (let i = 0; i < tail; i++) {\n if (buffer[i] === value) {\n return firstSegmentLength + i;\n }\n }\n }\n }\n return -1;\n }\n\n unwrap(): boolean {\n if (this.isEmpty()) {\n return false;\n }\n const length = this.#length;\n const buffer = this.#buffer;\n const prevHead = this.#head;\n const prevTail = this.#tail;\n\n if (prevHead > prevTail) {\n const bufferLength = buffer.length;\n buffer.length = bufferLength + prevTail;\n for (let i = 0; i < prevTail; i++) {\n buffer[bufferLength + i] = buffer[i];\n buffer[i] = undefined;\n }\n }\n for (let i = 0; i < length; i++) {\n buffer[i] = buffer[prevHead + i];\n }\n\n buffer.length = this.#mask + 1;\n this.#head = 0;\n this.#tail = length;\n this.#length = length;\n\n return true;\n }\n\n compact(filter: FilterFunction<T>): boolean {\n if (this.isEmpty()) {\n return false;\n }\n const length = this.#length;\n const buffer = this.#buffer;\n const head = this.#head;\n const mask = this.#mask;\n\n let bufferLength = buffer.length;\n let write = 0;\n for (let read = 0; read < length; read++) {\n const readOffset = (head + read) & mask;\n const value = buffer[readOffset]!;\n if (filter(value, read)) {\n if (read !== write) {\n const writeOffset = (head + write) & mask;\n buffer[writeOffset] = value;\n }\n write++;\n }\n }\n if (write === length) {\n return false;\n }\n if (write < bufferLength / 2) {\n const size = 1 << (32 - Math.clz32(write - 1));\n buffer.length = size;\n bufferLength = size;\n }\n\n for (let i = write; i < bufferLength; i++) {\n buffer[i] = undefined;\n }\n\n this.#head = 0;\n this.#tail = write;\n this.#length = write;\n return true;\n }\n\n push(value: T) {\n const tail = this.getTailOffset(1);\n if (tail === this.#head) {\n this.grow(this.#mask + 2);\n }\n this.#buffer[this.#tail] = value;\n this.#tail = this.getTailOffset(1);\n this.#length++;\n return this;\n }\n\n unshift(value: T): this {\n const head = this.getHeadOffset(-1);\n if (head === this.#tail) {\n this.grow(this.#mask + 2);\n }\n this.#head = this.getHeadOffset(-1);\n this.#buffer[this.#head] = value;\n this.#length++;\n return this;\n }\n\n shift(): T | undefined {\n if (this.#head === this.#tail) {\n return undefined;\n }\n const value = this.#buffer[this.#head];\n this.#buffer[this.#head] = undefined;\n this.#head = this.getHeadOffset(1);\n this.#length--;\n return value;\n }\n\n pop(): T | undefined {\n if (this.#head === this.#tail) {\n return undefined;\n }\n this.#tail = this.getTailOffset(-1);\n const value = this.#buffer[this.#tail];\n this.#buffer[this.#tail] = undefined;\n this.#length--;\n return value;\n }\n\n peekAt(index: number): T | undefined {\n if (index < 0 || index >= this.#length) {\n return undefined;\n }\n const offset = this.getHeadOffset(index);\n return this.#buffer[offset];\n }\n\n peekFirst(): T | undefined {\n return this.#buffer[this.#head];\n }\n\n peekLast(): T | undefined {\n const offset = this.getTailOffset(-1);\n return this.#buffer[offset];\n }\n\n has(value: T): boolean {\n return this.indexOf(value) !== -1;\n }\n\n insertOne(index: number, value: T): number {\n this.allocate(index, 1);\n this.#buffer[(this.#head + index) & this.#mask] = value;\n return index;\n }\n\n insert(index: number, values: T[]): number {\n const length = values.length;\n const writeBase = this.#head + index;\n this.allocate(index, length);\n for (let i = 0; i < length; i++) {\n this.#buffer[(writeBase + i) & this.#mask] = values[i];\n }\n\n return index;\n }\n\n removeOne(index: number): number {\n const length = this.#length;\n if (index < 0 || index >= length) {\n return -1;\n }\n const buffer = this.#buffer;\n const mask = this.#mask;\n const head = this.#head;\n\n const leftMoveCount = index;\n const rightMoveCount = length - index;\n\n if (leftMoveCount < rightMoveCount) {\n for (let i = index; i > 0; i--) {\n buffer[(head + i) & mask] = buffer[(head + i - 1) & mask];\n }\n buffer[head] = undefined;\n this.#head = (head + 1) & mask;\n } else {\n for (let i = index; i < length - 1; i++) {\n buffer[(head + i) & mask] = buffer[(head + i + 1) & mask];\n }\n const tail = (head + length - 1) & mask;\n buffer[tail] = undefined;\n this.#tail = tail;\n }\n this.#length = length - 1;\n\n return index;\n }\n\n removeFirst(value: T, index: number = 0): number {\n const foundIndex = this.indexOf(value, index);\n if (foundIndex === -1) {\n return -1;\n }\n return this.removeOne(foundIndex);\n }\n\n remove(index: number, count: number): T[] {\n const result = this.slice(index, count);\n this.deallocate(index, count);\n return result;\n }\n\n clear(): this {\n this.#buffer.length = 0;\n this.#buffer.length = DEFAULT_CAPACITY;\n this.#head = 0;\n this.#tail = 0;\n this.#length = 0;\n this.#mask = DEFAULT_CAPACITY - 1;\n return this;\n }\n\n slice(start: number = 0, end: number = this.#length): T[] {\n const length = this.#length;\n const buffer = this.#buffer;\n const head = this.#head;\n const tail = this.#tail;\n const mask = this.#mask;\n\n const actualStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);\n const actualEnd = end < 0 ? Math.max(length + end, 0) : Math.min(end, length);\n\n if (head <= tail) {\n return this.#buffer.slice(\n (head + actualStart) & mask,\n (head + actualEnd) & mask,\n ) as T[];\n }\n\n const size = Math.max(actualEnd - actualStart, 0);\n const result = new Array<T>(size);\n for (let i = 0; i < size; i++) {\n result[i] = buffer[(head + actualStart + i) & mask]!;\n }\n return result;\n }\n\n toArray(): T[] {\n return this.slice();\n }\n\n drain(): IteratorObject<T, void, unknown> {\n return Iterator.from({\n [Symbol.iterator]: () => {\n return {\n next: (): IteratorResult<T> => {\n if (this.#length === 0) {\n return { done: true, value: undefined };\n }\n const value = this.shift()!;\n return { done: false, value };\n },\n };\n },\n });\n }\n\n iter(): IteratorObject<T, void, unknown> {\n return Iterator.from(this[Symbol.iterator]());\n }\n\n [Symbol.iterator](): Iterator<T, void, unknown> {\n const buffer = this.#buffer;\n let idx = this.#head;\n return {\n next: (): IteratorResult<T> => {\n if (idx >= this.#head + this.#length) {\n return { done: true, value: undefined };\n }\n const offset = idx++ & this.#mask;\n const value = buffer[offset]!;\n return { done: false, value };\n },\n };\n }\n}\n\n\n"],"names":["RingBuffer","DEFAULT_CAPACITY","from","values","n","length","ring","i","Symbol","toStringTag","constructor","capacity","size","Math","max","clz32","Array","isEmpty","isWrapped","getHeadOffset","index","getTailOffset","grow","buffer","bufferLength","oldTail","allocate","count","prevLength","head","tail","prevMask","nextLength","wrapIndex","mask","isResized","leftMoveCount","rightMoveCount","read","write","undefined","writeBase","deallocate","actualCount","min","indexOf","value","offset","result","firstSegmentLength","startOffset","unwrap","prevHead","prevTail","compact","filter","readOffset","writeOffset","push","unshift","shift","pop","peekAt","peekFirst","peekLast","has","insertOne","insert","removeOne","removeFirst","foundIndex","remove","slice","clear","start","end","actualStart","actualEnd","toArray","drain","Iterator","iterator","next","done","iter","idx"],"mappings":";;;;+BAMaA;;;eAAAA;;;AANb,MAAMC,mBAAmB;AAMlB,MAAMD;IACX,CAAA,MAAO,CAAuB;IAC9B,CAAA,IAAK,GAAG,EAAE;IACV,CAAA,IAAK,GAAG,EAAE;IACV,CAAA,IAAK,CAAS;IACd,CAAA,MAAO,GAAG,EAAE;IAEZ,OAAOE,KAAQC,MAAW,EAAiB;QACzC,MAAMC,IAAID,OAAOE,MAAM;QACvB,MAAMC,OAAO,IAAIN,WAAcI;QAC/B,IAAK,IAAIG,IAAI,GAAGA,IAAIH,GAAGG,IAAK;YAC1BD,KAAK,CAAA,MAAO,CAACC,EAAE,GAAGJ,MAAM,CAACI,EAAE;QAC7B;QACAD,KAAK,CAAA,IAAK,GAAG;QACbA,KAAK,CAAA,IAAK,GAAGF;QACbE,KAAK,CAAA,MAAO,GAAGF;QAEf,OAAOE;IACT;IAES,CAACE,OAAOC,WAAW,CAAC,GAAG,aAAa;IAE7CC,YAAYC,WAAmBV,gBAAgB,CAAE;QAC/C,MAAMW,OAAOC,KAAKC,GAAG,CAAC,KAAM,KAAKD,KAAKE,KAAK,CAACJ,WAAYV;QACxD,IAAI,CAAC,CAAA,MAAO,GAAG,IAAIe,MAASJ;QAC5B,IAAI,CAAC,CAAA,IAAK,GAAGA,OAAO;IACtB;IAGA,IAAID,WAAW;QACb,OAAO,IAAI,CAAC,CAAA,IAAK,GAAG;IACtB;IAEA,IAAIN,SAAS;QACX,OAAO,IAAI,CAAC,CAAA,MAAO;IACrB;IAEAY,UAAmB;QACjB,OAAO,IAAI,CAAC,CAAA,IAAK,KAAK,IAAI,CAAC,CAAA,IAAK;IAClC;IAEAC,YAAqB;QACnB,OAAO,IAAI,CAAC,CAAA,IAAK,GAAG,IAAI,CAAC,CAAA,IAAK;IAChC;IAEAC,cAAcC,KAAa,EAAU;QACnC,OAAO,AAAC,IAAI,CAAC,CAAA,IAAK,GAAGA,QAAS,IAAI,CAAC,CAAA,IAAK;IAC1C;IAEAC,cAAcD,KAAa,EAAU;QACnC,OAAO,AAAC,IAAI,CAAC,CAAA,IAAK,GAAGA,QAAS,IAAI,CAAC,CAAA,IAAK;IAC1C;IAEAE,KAAKX,WAAmB,IAAI,CAAC,CAAA,IAAK,GAAG,CAAC,EAAQ;QAC5C,MAAMY,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMC,eAAeD,OAAOlB,MAAM;QAClC,IAAImB,gBAAgBb,WAAW,GAAG;YAChC;QACF;QACA,MAAMC,OAAO,KAAM,KAAKC,KAAKE,KAAK,CAACJ;QACnC,IAAI,CAAC,CAAA,MAAO,CAACN,MAAM,GAAGO;QAEtB,MAAMa,UAAU,IAAI,CAAC,CAAA,IAAK;QAC1B,IAAIA,UAAU,IAAI,CAAC,CAAA,IAAK,EAAE;YACxB,MAAMF,SAAS,IAAI,CAAC,CAAA,MAAO;YAC3B,IAAK,IAAIhB,IAAI,GAAGA,IAAIkB,SAASlB,IAAK;gBAChCgB,MAAM,CAACC,eAAejB,EAAE,GAAGgB,MAAM,CAAChB,EAAE;YACtC;YACA,IAAI,CAAC,CAAA,IAAK,GAAGiB,eAAeC;QAC9B;QAEA,IAAI,CAAC,CAAA,IAAK,GAAGb,OAAO;IACtB;IAEAc,SAASN,KAAa,EAAEO,KAAa,EAAW;QAC9C,MAAMC,aAAa,IAAI,CAAC,CAAA,MAAO;QAC/B,IAAIR,QAAQ,KAAKA,QAAQQ,cAAcD,SAAS,GAAG;YACjD,OAAO;QACT;QAEA,MAAMJ,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMM,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMC,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMC,WAAW,IAAI,CAAC,CAAA,IAAK;QAE3B,MAAMC,aAAaL,QAAQC;QAC3B,MAAMK,YAAYV,OAAOlB,MAAM,GAAGwB;QAClC,MAAMX,YAAYW,OAAOC;QAEzB,IAAIE,cAAcT,OAAOlB,MAAM,EAAE;YAC/B,MAAMO,OAAO,KAAM,KAAKC,KAAKE,KAAK,CAACiB;YACnCT,OAAOlB,MAAM,GAAGO;YAChB,IAAI,CAAC,CAAA,IAAK,GAAGA,OAAO;QACtB;QAEA,MAAMsB,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMC,YAAYJ,aAAaG;QAE/B,MAAME,gBAAgBhB;QACtB,MAAMiB,iBAAiBT,aAAaR;QAEpC,IAAIgB,gBAAgBC,gBAAgB;YAClC,IAAIF,aAAajB,WAAW;gBAC1B,IAAK,IAAIX,IAAI,GAAGA,IAAIuB,MAAMvB,IAAK;oBAC7B,MAAM+B,OAAO/B;oBACb,MAAMgC,QAAQ,AAACV,OAAOI,YAAY1B,IAAK2B;oBACvCX,MAAM,CAACgB,MAAM,GAAGhB,MAAM,CAACe,KAAK;oBAC5Bf,MAAM,CAACe,KAAK,GAAGE;gBACjB;YACF;YACA,MAAMC,YAAY,AAACZ,OAAOF,QAASO;YACnC,IAAK,IAAI3B,IAAI,GAAGA,IAAI6B,eAAe7B,IAAK;gBACtC,MAAM+B,OAAO,AAACT,OAAOtB,IAAK2B;gBAC1B,MAAMK,QAAQ,AAACE,YAAYlC,IAAK2B;gBAChCX,MAAM,CAACgB,MAAM,GAAGhB,MAAM,CAACe,KAAK;gBAC5Bf,MAAM,CAACe,KAAK,GAAGE;YACjB;YACA,IAAI,CAAC,CAAA,IAAK,GAAGC;QACf,OAAO;YACL,IAAIN,aAAajB,WAAW;gBAC1B,IAAK,IAAIX,IAAI,GAAGA,IAAIuB,MAAMvB,IAAK;oBAC7B,MAAM+B,OAAO/B;oBACb,MAAMgC,QAAQ,AAACV,OAAOI,YAAY1B,IAAK2B;oBACvCX,MAAM,CAACgB,MAAM,GAAGhB,MAAM,CAACe,KAAK;oBAC5Bf,MAAM,CAACe,KAAK,GAAGE;gBACjB;YACF;YAEA,IAAK,IAAIjC,IAAI8B,iBAAiB,GAAG9B,KAAK,GAAGA,IAAK;gBAC5C,MAAM+B,OAAO,AAACT,OAAOT,QAAQb,IAAK2B;gBAClC,MAAMK,QAAQ,AAACV,OAAOT,QAAQO,QAAQpB,IAAK2B;gBAE3CX,MAAM,CAACgB,MAAM,GAAGhB,MAAM,CAACe,KAAK;gBAC5Bf,MAAM,CAACe,KAAK,GAAGE;YACjB;YAEA,IAAI,CAAC,CAAA,IAAK,GAAG,AAACX,OAAOG,aAAcE;QACrC;QAEA,IAAI,CAAC,CAAA,MAAO,GAAGF;QACf,OAAO;IACT;IAEAU,WAAWtB,KAAa,EAAEO,KAAa,EAAW;QAChD,MAAMC,aAAa,IAAI,CAAC,CAAA,MAAO;QAC/B,IAAIR,QAAQ,KAAKA,SAASQ,cAAcD,SAAS,GAAG;YAClD,OAAO;QACT;QAEA,MAAMgB,cAAc9B,KAAK+B,GAAG,CAACjB,OAAOC,aAAaR;QACjD,MAAMY,aAAaJ,aAAae;QAEhC,MAAMpB,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMM,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMC,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMI,OAAO,IAAI,CAAC,CAAA,IAAK;QAEvB,IAAId,UAAU,GAAG;YACf,IAAK,IAAIb,IAAI,GAAGA,IAAIoC,aAAapC,IAAK;gBACpCgB,MAAM,CAAC,AAACM,OAAOtB,IAAK2B,KAAK,GAAGM;YAC9B;YACA,IAAI,CAAC,CAAA,IAAK,GAAG,AAACX,OAAOc,cAAeT;YACpC,IAAI,CAAC,CAAA,MAAO,GAAGF;YACf,OAAO;QACT;QAEA,IAAIZ,QAAQuB,gBAAgBf,YAAY;YACtC,IAAK,IAAIrB,IAAI,GAAGA,IAAIoC,aAAapC,IAAK;gBACpCgB,MAAM,CAAC,AAACO,OAAOvB,IAAI,IAAK2B,KAAK,GAAGM;YAClC;YACA,IAAI,CAAC,CAAA,IAAK,GAAG,AAACV,OAAOa,cAAeT;YACpC,IAAI,CAAC,CAAA,MAAO,GAAGF;YACf,OAAO;QACT;QAEA,MAAMI,gBAAgBhB;QACtB,MAAMiB,iBAAiBT,aAAaR,QAAQuB;QAE5C,IAAIP,gBAAgBC,gBAAgB;YAClC,IAAK,IAAI9B,IAAI6B,gBAAgB,GAAG7B,KAAK,GAAGA,IAAK;gBAC3C,MAAM+B,OAAO,AAACT,OAAOtB,IAAK2B;gBAC1B,MAAMK,QAAQ,AAACV,OAAOtB,IAAIoC,cAAeT;gBACzCX,MAAM,CAACgB,MAAM,GAAGhB,MAAM,CAACe,KAAK;YAC9B;YACA,IAAK,IAAI/B,IAAI,GAAGA,IAAIoC,aAAapC,IAAK;gBACpCgB,MAAM,CAAC,AAACM,OAAOtB,IAAK2B,KAAK,GAAGM;YAC9B;YACA,IAAI,CAAC,CAAA,IAAK,GAAG,AAACX,OAAOc,cAAeT;QACtC,OAAO;YACL,IAAK,IAAI3B,IAAI,GAAGA,IAAI8B,gBAAgB9B,IAAK;gBACvC,MAAM+B,OAAO,AAACT,OAAOT,QAAQuB,cAAcpC,IAAK2B;gBAChD,MAAMK,QAAQ,AAACV,OAAOT,QAAQb,IAAK2B;gBACnCX,MAAM,CAACgB,MAAM,GAAGhB,MAAM,CAACe,KAAK;YAC9B;YACA,IAAI,CAAC,CAAA,IAAK,GAAG,AAACR,OAAOa,cAAeT;YACpC,IAAK,IAAI3B,IAAI,GAAGA,IAAIoC,aAAapC,IAAK;gBACpCgB,MAAM,CAAC,AAACO,OAAOvB,IAAK2B,KAAK,GAAGM;YAC9B;QACF;QAEA,IAAI,CAAC,CAAA,MAAO,GAAGR;QACf,OAAO;IACT;IAEAa,QAAQC,KAAQ,EAAE1B,QAAgB,CAAC,EAAU;QAC3C,MAAMf,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMkB,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMM,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMC,OAAO,IAAI,CAAC,CAAA,IAAK;QAEvB,IAAID,OAAOC,MAAM;YACf,MAAMiB,SAASlB,OAAOT;YACtB,MAAM4B,SAASzB,OAAOsB,OAAO,CAACC,OAAOC;YACrC,IAAIC,WAAW,CAAC,KAAKA,SAASlB,MAAM;gBAClC,OAAOkB,SAASnB;YAClB;YACA,OAAO,CAAC;QACV;QACA,MAAMlB,WAAWY,OAAOlB,MAAM;QAC9B,MAAM4C,qBAAqBtC,WAAWkB;QAEtC,IAAIT,QAAQ6B,oBAAoB;YAC9B,MAAMC,cAAcrB,OAAOT;YAC3B,MAAM4B,SAASzB,OAAOsB,OAAO,CAACC,OAAOI;YACrC,IAAIF,WAAW,CAAC,GAAG;gBACjB,OAAOA,SAASnB;YAClB;YACAT,QAAQ6B;QACV;QAEA,IAAI7B,QAAQf,QAAQ;YAClB,IAAIyB,OAAOzB,SAAS,GAAG;gBACrB,MAAM2C,SAASzB,OAAOsB,OAAO,CAACC;gBAC9B,IAAIE,WAAW,CAAC,KAAKA,SAASlB,MAAM;oBAClC,OAAOmB,qBAAqBD;gBAC9B;YACF,OAAO;gBACL,IAAK,IAAIzC,IAAI,GAAGA,IAAIuB,MAAMvB,IAAK;oBAC7B,IAAIgB,MAAM,CAAChB,EAAE,KAAKuC,OAAO;wBACvB,OAAOG,qBAAqB1C;oBAC9B;gBACF;YACF;QACF;QACA,OAAO,CAAC;IACV;IAEA4C,SAAkB;QAChB,IAAI,IAAI,CAAClC,OAAO,IAAI;YAClB,OAAO;QACT;QACA,MAAMZ,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMkB,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAM6B,WAAW,IAAI,CAAC,CAAA,IAAK;QAC3B,MAAMC,WAAW,IAAI,CAAC,CAAA,IAAK;QAE3B,IAAID,WAAWC,UAAU;YACvB,MAAM7B,eAAeD,OAAOlB,MAAM;YAClCkB,OAAOlB,MAAM,GAAGmB,eAAe6B;YAC/B,IAAK,IAAI9C,IAAI,GAAGA,IAAI8C,UAAU9C,IAAK;gBACjCgB,MAAM,CAACC,eAAejB,EAAE,GAAGgB,MAAM,CAAChB,EAAE;gBACpCgB,MAAM,CAAChB,EAAE,GAAGiC;YACd;QACF;QACA,IAAK,IAAIjC,IAAI,GAAGA,IAAIF,QAAQE,IAAK;YAC/BgB,MAAM,CAAChB,EAAE,GAAGgB,MAAM,CAAC6B,WAAW7C,EAAE;QAClC;QAEAgB,OAAOlB,MAAM,GAAG,IAAI,CAAC,CAAA,IAAK,GAAG;QAC7B,IAAI,CAAC,CAAA,IAAK,GAAG;QACb,IAAI,CAAC,CAAA,IAAK,GAAGA;QACb,IAAI,CAAC,CAAA,MAAO,GAAGA;QAEf,OAAO;IACT;IAEAiD,QAAQC,MAAyB,EAAW;QAC1C,IAAI,IAAI,CAACtC,OAAO,IAAI;YAClB,OAAO;QACT;QACA,MAAMZ,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMkB,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMM,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMK,OAAO,IAAI,CAAC,CAAA,IAAK;QAEvB,IAAIV,eAAeD,OAAOlB,MAAM;QAChC,IAAIkC,QAAQ;QACZ,IAAK,IAAID,OAAO,GAAGA,OAAOjC,QAAQiC,OAAQ;YACxC,MAAMkB,aAAa,AAAC3B,OAAOS,OAAQJ;YACnC,MAAMY,QAAQvB,MAAM,CAACiC,WAAW;YAChC,IAAID,OAAOT,OAAOR,OAAO;gBACvB,IAAIA,SAASC,OAAO;oBAClB,MAAMkB,cAAc,AAAC5B,OAAOU,QAASL;oBACrCX,MAAM,CAACkC,YAAY,GAAGX;gBACxB;gBACAP;YACF;QACF;QACA,IAAIA,UAAUlC,QAAQ;YACpB,OAAO;QACT;QACA,IAAIkC,QAAQf,eAAe,GAAG;YAC5B,MAAMZ,OAAO,KAAM,KAAKC,KAAKE,KAAK,CAACwB,QAAQ;YAC3ChB,OAAOlB,MAAM,GAAGO;YAChBY,eAAeZ;QACjB;QAEA,IAAK,IAAIL,IAAIgC,OAAOhC,IAAIiB,cAAcjB,IAAK;YACzCgB,MAAM,CAAChB,EAAE,GAAGiC;QACd;QAEA,IAAI,CAAC,CAAA,IAAK,GAAG;QACb,IAAI,CAAC,CAAA,IAAK,GAAGD;QACb,IAAI,CAAC,CAAA,MAAO,GAAGA;QACf,OAAO;IACT;IAEAmB,KAAKZ,KAAQ,EAAE;QACb,MAAMhB,OAAO,IAAI,CAACT,aAAa,CAAC;QAChC,IAAIS,SAAS,IAAI,CAAC,CAAA,IAAK,EAAE;YACvB,IAAI,CAACR,IAAI,CAAC,IAAI,CAAC,CAAA,IAAK,GAAG;QACzB;QACA,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC,GAAGwB;QAC3B,IAAI,CAAC,CAAA,IAAK,GAAG,IAAI,CAACzB,aAAa,CAAC;QAChC,IAAI,CAAC,CAAA,MAAO;QACZ,OAAO,IAAI;IACb;IAEAsC,QAAQb,KAAQ,EAAQ;QACtB,MAAMjB,OAAO,IAAI,CAACV,aAAa,CAAC,CAAC;QACjC,IAAIU,SAAS,IAAI,CAAC,CAAA,IAAK,EAAE;YACvB,IAAI,CAACP,IAAI,CAAC,IAAI,CAAC,CAAA,IAAK,GAAG;QACzB;QACA,IAAI,CAAC,CAAA,IAAK,GAAG,IAAI,CAACH,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC,GAAG2B;QAC3B,IAAI,CAAC,CAAA,MAAO;QACZ,OAAO,IAAI;IACb;IAEAc,QAAuB;QACrB,IAAI,IAAI,CAAC,CAAA,IAAK,KAAK,IAAI,CAAC,CAAA,IAAK,EAAE;YAC7B,OAAOpB;QACT;QACA,MAAMM,QAAQ,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC;QACtC,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC,GAAGN;QAC3B,IAAI,CAAC,CAAA,IAAK,GAAG,IAAI,CAACrB,aAAa,CAAC;QAChC,IAAI,CAAC,CAAA,MAAO;QACZ,OAAO2B;IACT;IAEAe,MAAqB;QACnB,IAAI,IAAI,CAAC,CAAA,IAAK,KAAK,IAAI,CAAC,CAAA,IAAK,EAAE;YAC7B,OAAOrB;QACT;QACA,IAAI,CAAC,CAAA,IAAK,GAAG,IAAI,CAACnB,aAAa,CAAC,CAAC;QACjC,MAAMyB,QAAQ,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC;QACtC,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC,GAAGN;QAC3B,IAAI,CAAC,CAAA,MAAO;QACZ,OAAOM;IACT;IAEAgB,OAAO1C,KAAa,EAAiB;QACnC,IAAIA,QAAQ,KAAKA,SAAS,IAAI,CAAC,CAAA,MAAO,EAAE;YACtC,OAAOoB;QACT;QACA,MAAMO,SAAS,IAAI,CAAC5B,aAAa,CAACC;QAClC,OAAO,IAAI,CAAC,CAAA,MAAO,CAAC2B,OAAO;IAC7B;IAEAgB,YAA2B;QACzB,OAAO,IAAI,CAAC,CAAA,MAAO,CAAC,IAAI,CAAC,CAAA,IAAK,CAAC;IACjC;IAEAC,WAA0B;QACxB,MAAMjB,SAAS,IAAI,CAAC1B,aAAa,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,CAAA,MAAO,CAAC0B,OAAO;IAC7B;IAEAkB,IAAInB,KAAQ,EAAW;QACrB,OAAO,IAAI,CAACD,OAAO,CAACC,WAAW,CAAC;IAClC;IAEAoB,UAAU9C,KAAa,EAAE0B,KAAQ,EAAU;QACzC,IAAI,CAACpB,QAAQ,CAACN,OAAO;QACrB,IAAI,CAAC,CAAA,MAAO,CAAC,AAAC,IAAI,CAAC,CAAA,IAAK,GAAGA,QAAS,IAAI,CAAC,CAAA,IAAK,CAAC,GAAG0B;QAClD,OAAO1B;IACT;IAEA+C,OAAO/C,KAAa,EAAEjB,MAAW,EAAU;QACzC,MAAME,SAASF,OAAOE,MAAM;QAC5B,MAAMoC,YAAY,IAAI,CAAC,CAAA,IAAK,GAAGrB;QAC/B,IAAI,CAACM,QAAQ,CAACN,OAAOf;QACrB,IAAK,IAAIE,IAAI,GAAGA,IAAIF,QAAQE,IAAK;YAC/B,IAAI,CAAC,CAAA,MAAO,CAAC,AAACkC,YAAYlC,IAAK,IAAI,CAAC,CAAA,IAAK,CAAC,GAAGJ,MAAM,CAACI,EAAE;QACxD;QAEA,OAAOa;IACT;IAEAgD,UAAUhD,KAAa,EAAU;QAC/B,MAAMf,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,IAAIe,QAAQ,KAAKA,SAASf,QAAQ;YAChC,OAAO,CAAC;QACV;QACA,MAAMkB,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMW,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAML,OAAO,IAAI,CAAC,CAAA,IAAK;QAEvB,MAAMO,gBAAgBhB;QACtB,MAAMiB,iBAAiBhC,SAASe;QAEhC,IAAIgB,gBAAgBC,gBAAgB;YAClC,IAAK,IAAI9B,IAAIa,OAAOb,IAAI,GAAGA,IAAK;gBAC9BgB,MAAM,CAAC,AAACM,OAAOtB,IAAK2B,KAAK,GAAGX,MAAM,CAAC,AAACM,OAAOtB,IAAI,IAAK2B,KAAK;YAC3D;YACAX,MAAM,CAACM,KAAK,GAAGW;YACf,IAAI,CAAC,CAAA,IAAK,GAAG,AAACX,OAAO,IAAKK;QAC5B,OAAO;YACL,IAAK,IAAI3B,IAAIa,OAAOb,IAAIF,SAAS,GAAGE,IAAK;gBACvCgB,MAAM,CAAC,AAACM,OAAOtB,IAAK2B,KAAK,GAAGX,MAAM,CAAC,AAACM,OAAOtB,IAAI,IAAK2B,KAAK;YAC3D;YACA,MAAMJ,OAAO,AAACD,OAAOxB,SAAS,IAAK6B;YACnCX,MAAM,CAACO,KAAK,GAAGU;YACf,IAAI,CAAC,CAAA,IAAK,GAAGV;QACf;QACA,IAAI,CAAC,CAAA,MAAO,GAAGzB,SAAS;QAExB,OAAOe;IACT;IAEAiD,YAAYvB,KAAQ,EAAE1B,QAAgB,CAAC,EAAU;QAC/C,MAAMkD,aAAa,IAAI,CAACzB,OAAO,CAACC,OAAO1B;QACvC,IAAIkD,eAAe,CAAC,GAAG;YACrB,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAACF,SAAS,CAACE;IACxB;IAEAC,OAAOnD,KAAa,EAAEO,KAAa,EAAO;QACxC,MAAMqB,SAAS,IAAI,CAACwB,KAAK,CAACpD,OAAOO;QACjC,IAAI,CAACe,UAAU,CAACtB,OAAOO;QACvB,OAAOqB;IACT;IAEAyB,QAAc;QACZ,IAAI,CAAC,CAAA,MAAO,CAACpE,MAAM,GAAG;QACtB,IAAI,CAAC,CAAA,MAAO,CAACA,MAAM,GAAGJ;QACtB,IAAI,CAAC,CAAA,IAAK,GAAG;QACb,IAAI,CAAC,CAAA,IAAK,GAAG;QACb,IAAI,CAAC,CAAA,MAAO,GAAG;QACf,IAAI,CAAC,CAAA,IAAK,GAAGA,mBAAmB;QAChC,OAAO,IAAI;IACb;IAEAuE,MAAME,QAAgB,CAAC,EAAEC,MAAc,IAAI,CAAC,CAAA,MAAO,EAAO;QACxD,MAAMtE,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMkB,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,MAAMM,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMC,OAAO,IAAI,CAAC,CAAA,IAAK;QACvB,MAAMI,OAAO,IAAI,CAAC,CAAA,IAAK;QAEvB,MAAM0C,cAAcF,QAAQ,IAAI7D,KAAKC,GAAG,CAACT,SAASqE,OAAO,KAAK7D,KAAK+B,GAAG,CAAC8B,OAAOrE;QAC9E,MAAMwE,YAAYF,MAAM,IAAI9D,KAAKC,GAAG,CAACT,SAASsE,KAAK,KAAK9D,KAAK+B,GAAG,CAAC+B,KAAKtE;QAEtE,IAAIwB,QAAQC,MAAM;YAChB,OAAO,IAAI,CAAC,CAAA,MAAO,CAAC0C,KAAK,CACvB,AAAC3C,OAAO+C,cAAe1C,MACvB,AAACL,OAAOgD,YAAa3C;QAEzB;QAEA,MAAMtB,OAAOC,KAAKC,GAAG,CAAC+D,YAAYD,aAAa;QAC/C,MAAM5B,SAAS,IAAIhC,MAASJ;QAC5B,IAAK,IAAIL,IAAI,GAAGA,IAAIK,MAAML,IAAK;YAC7ByC,MAAM,CAACzC,EAAE,GAAGgB,MAAM,CAAC,AAACM,OAAO+C,cAAcrE,IAAK2B,KAAK;QACrD;QACA,OAAOc;IACT;IAEA8B,UAAe;QACb,OAAO,IAAI,CAACN,KAAK;IACnB;IAEAO,QAA0C;QACxC,OAAOC,SAAS9E,IAAI,CAAC;YACnB,CAACM,OAAOyE,QAAQ,CAAC,EAAE;gBACjB,OAAO;oBACLC,MAAM;wBACJ,IAAI,IAAI,CAAC,CAAA,MAAO,KAAK,GAAG;4BACtB,OAAO;gCAAEC,MAAM;gCAAMrC,OAAON;4BAAU;wBACxC;wBACA,MAAMM,QAAQ,IAAI,CAACc,KAAK;wBACxB,OAAO;4BAAEuB,MAAM;4BAAOrC;wBAAM;oBAC9B;gBACF;YACF;QACF;IACF;IAEAsC,OAAyC;QACvC,OAAOJ,SAAS9E,IAAI,CAAC,IAAI,CAACM,OAAOyE,QAAQ,CAAC;IAC5C;IAEA,CAACzE,OAAOyE,QAAQ,CAAC,GAA+B;QAC9C,MAAM1D,SAAS,IAAI,CAAC,CAAA,MAAO;QAC3B,IAAI8D,MAAM,IAAI,CAAC,CAAA,IAAK;QACpB,OAAO;YACLH,MAAM;gBACJ,IAAIG,OAAO,IAAI,CAAC,CAAA,IAAK,GAAG,IAAI,CAAC,CAAA,MAAO,EAAE;oBACpC,OAAO;wBAAEF,MAAM;wBAAMrC,OAAON;oBAAU;gBACxC;gBACA,MAAMO,SAASsC,QAAQ,IAAI,CAAC,CAAA,IAAK;gBACjC,MAAMvC,QAAQvB,MAAM,CAACwB,OAAO;gBAC5B,OAAO;oBAAEoC,MAAM;oBAAOrC;gBAAM;YAC9B;QACF;IACF;AACF"}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
export interface FilterFunction<T> {
|
2
|
+
(value: T, index: number): boolean;
|
3
|
+
}
|
4
|
+
export declare class RingBuffer<T> {
|
5
|
+
#private;
|
6
|
+
static from<T>(values: T[]): RingBuffer<T>;
|
7
|
+
readonly [Symbol.toStringTag] = "RingBuffer";
|
8
|
+
constructor(capacity?: number);
|
9
|
+
get capacity(): number;
|
10
|
+
get length(): number;
|
11
|
+
isEmpty(): boolean;
|
12
|
+
isWrapped(): boolean;
|
13
|
+
getHeadOffset(index: number): number;
|
14
|
+
getTailOffset(index: number): number;
|
15
|
+
grow(capacity?: number): void;
|
16
|
+
allocate(index: number, count: number): boolean;
|
17
|
+
deallocate(index: number, count: number): boolean;
|
18
|
+
indexOf(value: T, index?: number): number;
|
19
|
+
unwrap(): boolean;
|
20
|
+
compact(filter: FilterFunction<T>): boolean;
|
21
|
+
push(value: T): this;
|
22
|
+
unshift(value: T): this;
|
23
|
+
shift(): T | undefined;
|
24
|
+
pop(): T | undefined;
|
25
|
+
peekAt(index: number): T | undefined;
|
26
|
+
peekFirst(): T | undefined;
|
27
|
+
peekLast(): T | undefined;
|
28
|
+
has(value: T): boolean;
|
29
|
+
insertOne(index: number, value: T): number;
|
30
|
+
insert(index: number, values: T[]): number;
|
31
|
+
removeOne(index: number): number;
|
32
|
+
removeFirst(value: T, index?: number): number;
|
33
|
+
remove(index: number, count: number): T[];
|
34
|
+
clear(): this;
|
35
|
+
slice(start?: number, end?: number): T[];
|
36
|
+
toArray(): T[];
|
37
|
+
drain(): IteratorObject<T, void, unknown>;
|
38
|
+
iter(): IteratorObject<T, void, unknown>;
|
39
|
+
[Symbol.iterator](): Iterator<T, void, unknown>;
|
40
|
+
}
|