fastds 0.0.1-rc.0 → 0.0.1-rc.1
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/build/__bench__/index.d.ts +1 -0
- package/build/binary-search.cjs +13 -7
- package/build/binary-search.cjs.map +1 -1
- package/build/binary-search.js +13 -7
- package/build/binary-search.js.map +1 -1
- package/build/index.cjs.map +1 -1
- package/build/index.js.map +1 -1
- package/build/ring-buffer.cjs +131 -75
- package/build/ring-buffer.cjs.map +1 -1
- package/build/ring-buffer.d.ts +7 -6
- package/build/ring-buffer.js +131 -75
- package/build/ring-buffer.js.map +1 -1
- package/package.json +12 -13
- package/src/index.ts +0 -1
- package/src/ring-buffer.ts +151 -94
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
package/build/binary-search.cjs
CHANGED
@@ -24,10 +24,12 @@ class BinarySearchArray {
|
|
24
24
|
return this.#buffer.peekAt(index);
|
25
25
|
}
|
26
26
|
lowerBound(value) {
|
27
|
+
const length = this.#buffer.length;
|
28
|
+
if (length === 0) return 0;
|
27
29
|
let left = 0;
|
28
|
-
let right =
|
30
|
+
let right = length;
|
29
31
|
while(left < right){
|
30
|
-
const mid =
|
32
|
+
const mid = left + right >>> 1;
|
31
33
|
if (this.#comparator(this.#buffer.peekAt(mid), value) < 0) {
|
32
34
|
left = mid + 1;
|
33
35
|
} else {
|
@@ -37,10 +39,12 @@ class BinarySearchArray {
|
|
37
39
|
return left;
|
38
40
|
}
|
39
41
|
upperBound(value) {
|
42
|
+
const length = this.#buffer.length;
|
43
|
+
if (length === 0) return 0;
|
40
44
|
let left = 0;
|
41
|
-
let right =
|
45
|
+
let right = length;
|
42
46
|
while(left < right){
|
43
|
-
const mid =
|
47
|
+
const mid = left + right >>> 1;
|
44
48
|
if (this.#comparator(this.#buffer.peekAt(mid), value) <= 0) {
|
45
49
|
left = mid + 1;
|
46
50
|
} else {
|
@@ -50,10 +54,12 @@ class BinarySearchArray {
|
|
50
54
|
return left;
|
51
55
|
}
|
52
56
|
indexOf(value, index = 0) {
|
57
|
+
const length = this.#buffer.length;
|
58
|
+
if (length === 0 || index >= length) return -1;
|
53
59
|
let left = index;
|
54
|
-
let right =
|
60
|
+
let right = length - 1;
|
55
61
|
while(left <= right){
|
56
|
-
const mid =
|
62
|
+
const mid = left + right >>> 1;
|
57
63
|
const cmp = this.#comparator(this.#buffer.peekAt(mid), value);
|
58
64
|
if (cmp === 0) {
|
59
65
|
return mid;
|
@@ -70,7 +76,7 @@ class BinarySearchArray {
|
|
70
76
|
}
|
71
77
|
insert(value) {
|
72
78
|
const index = this.lowerBound(value);
|
73
|
-
this.#buffer.
|
79
|
+
this.#buffer.setOne(index, value, true);
|
74
80
|
return index;
|
75
81
|
}
|
76
82
|
removeOne(index) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/binary-search.ts"],"sourcesContent":["import { RingBuffer } from './ring-buffer.js';\n\nexport interface Comparator<T> {\n (a: T, b: T): number;\n}\n\nexport class BinarySearchArray<T> implements Iterable<T, void, unknown> {\n #buffer: RingBuffer<T>;\n #comparator: Comparator<T>;\n\n constructor(comparator: Comparator<T>) {\n this.#buffer = new RingBuffer();\n this.#comparator = comparator;\n }\n\n readonly [Symbol.toStringTag] = 'BinarySearchArray';\n\n get length(): number {\n return this.#buffer.length;\n }\n\n at(index: number) {\n return this.#buffer.peekAt(index);\n }\n\n lowerBound(value: T): number {\n let left = 0;\n let right =
|
1
|
+
{"version":3,"sources":["../src/binary-search.ts"],"sourcesContent":["import { RingBuffer } from './ring-buffer.js';\n\nexport interface Comparator<T> {\n (a: T, b: T): number;\n}\n\nexport class BinarySearchArray<T> implements Iterable<T, void, unknown> {\n #buffer: RingBuffer<T>;\n #comparator: Comparator<T>;\n\n constructor(comparator: Comparator<T>) {\n this.#buffer = new RingBuffer();\n this.#comparator = comparator;\n }\n\n readonly [Symbol.toStringTag] = 'BinarySearchArray';\n\n get length(): number {\n return this.#buffer.length;\n }\n\n at(index: number) {\n return this.#buffer.peekAt(index);\n }\n\n lowerBound(value: T): number {\n const length = this.#buffer.length;\n if (length === 0) return 0;\n\n let left = 0;\n let right = length;\n\n while (left < right) {\n const mid = (left + right) >>> 1;\n if (this.#comparator(this.#buffer.peekAt(mid)!, value) < 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n return left;\n }\n\n upperBound(value: T): number {\n const length = this.#buffer.length;\n if (length === 0) return 0;\n\n let left = 0;\n let right = length;\n\n while (left < right) {\n const mid = (left + right) >>> 1;\n if (this.#comparator(this.#buffer.peekAt(mid)!, value) <= 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n return left;\n }\n\n indexOf(value: T, index = 0) {\n const length = this.#buffer.length;\n if (length === 0 || index >= length) return -1;\n\n let left = index;\n let right = length - 1;\n\n while (left <= right) {\n const mid = (left + right) >>> 1;\n const cmp = this.#comparator(this.#buffer.peekAt(mid)!, value);\n\n if (cmp === 0) {\n return mid;\n } else if (cmp < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return -1;\n }\n\n has(value: T): boolean {\n return this.indexOf(value) !== -1;\n }\n\n insert(value: T) {\n const index = this.lowerBound(value);\n this.#buffer.setOne(index, value, true);\n\n return index;\n }\n\n removeOne(index: number) {\n return this.#buffer.removeOne(index);\n }\n\n removeFirst(value: T) {\n const index = this.indexOf(value);\n return this.#buffer.removeOne(index);\n }\n\n remove(index: number, count: number): this {\n this.#buffer.deallocate(index, count);\n\n return this;\n }\n\n iter() {\n return this.#buffer.iter();\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.#buffer[Symbol.iterator]();\n }\n}\n"],"names":["BinarySearchArray","constructor","comparator","RingBuffer","Symbol","toStringTag","length","at","index","peekAt","lowerBound","value","left","right","mid","upperBound","indexOf","cmp","has","insert","setOne","removeOne","removeFirst","remove","count","deallocate","iter","iterator"],"mappings":"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"}
|
package/build/binary-search.js
CHANGED
@@ -14,10 +14,12 @@ export class BinarySearchArray {
|
|
14
14
|
return this.#buffer.peekAt(index);
|
15
15
|
}
|
16
16
|
lowerBound(value) {
|
17
|
+
const length = this.#buffer.length;
|
18
|
+
if (length === 0) return 0;
|
17
19
|
let left = 0;
|
18
|
-
let right =
|
20
|
+
let right = length;
|
19
21
|
while(left < right){
|
20
|
-
const mid =
|
22
|
+
const mid = left + right >>> 1;
|
21
23
|
if (this.#comparator(this.#buffer.peekAt(mid), value) < 0) {
|
22
24
|
left = mid + 1;
|
23
25
|
} else {
|
@@ -27,10 +29,12 @@ export class BinarySearchArray {
|
|
27
29
|
return left;
|
28
30
|
}
|
29
31
|
upperBound(value) {
|
32
|
+
const length = this.#buffer.length;
|
33
|
+
if (length === 0) return 0;
|
30
34
|
let left = 0;
|
31
|
-
let right =
|
35
|
+
let right = length;
|
32
36
|
while(left < right){
|
33
|
-
const mid =
|
37
|
+
const mid = left + right >>> 1;
|
34
38
|
if (this.#comparator(this.#buffer.peekAt(mid), value) <= 0) {
|
35
39
|
left = mid + 1;
|
36
40
|
} else {
|
@@ -40,10 +44,12 @@ export class BinarySearchArray {
|
|
40
44
|
return left;
|
41
45
|
}
|
42
46
|
indexOf(value, index = 0) {
|
47
|
+
const length = this.#buffer.length;
|
48
|
+
if (length === 0 || index >= length) return -1;
|
43
49
|
let left = index;
|
44
|
-
let right =
|
50
|
+
let right = length - 1;
|
45
51
|
while(left <= right){
|
46
|
-
const mid =
|
52
|
+
const mid = left + right >>> 1;
|
47
53
|
const cmp = this.#comparator(this.#buffer.peekAt(mid), value);
|
48
54
|
if (cmp === 0) {
|
49
55
|
return mid;
|
@@ -60,7 +66,7 @@ export class BinarySearchArray {
|
|
60
66
|
}
|
61
67
|
insert(value) {
|
62
68
|
const index = this.lowerBound(value);
|
63
|
-
this.#buffer.
|
69
|
+
this.#buffer.setOne(index, value, true);
|
64
70
|
return index;
|
65
71
|
}
|
66
72
|
removeOne(index) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/binary-search.ts"],"sourcesContent":["import { RingBuffer } from './ring-buffer.js';\n\nexport interface Comparator<T> {\n (a: T, b: T): number;\n}\n\nexport class BinarySearchArray<T> implements Iterable<T, void, unknown> {\n #buffer: RingBuffer<T>;\n #comparator: Comparator<T>;\n\n constructor(comparator: Comparator<T>) {\n this.#buffer = new RingBuffer();\n this.#comparator = comparator;\n }\n\n readonly [Symbol.toStringTag] = 'BinarySearchArray';\n\n get length(): number {\n return this.#buffer.length;\n }\n\n at(index: number) {\n return this.#buffer.peekAt(index);\n }\n\n lowerBound(value: T): number {\n let left = 0;\n let right =
|
1
|
+
{"version":3,"sources":["../src/binary-search.ts"],"sourcesContent":["import { RingBuffer } from './ring-buffer.js';\n\nexport interface Comparator<T> {\n (a: T, b: T): number;\n}\n\nexport class BinarySearchArray<T> implements Iterable<T, void, unknown> {\n #buffer: RingBuffer<T>;\n #comparator: Comparator<T>;\n\n constructor(comparator: Comparator<T>) {\n this.#buffer = new RingBuffer();\n this.#comparator = comparator;\n }\n\n readonly [Symbol.toStringTag] = 'BinarySearchArray';\n\n get length(): number {\n return this.#buffer.length;\n }\n\n at(index: number) {\n return this.#buffer.peekAt(index);\n }\n\n lowerBound(value: T): number {\n const length = this.#buffer.length;\n if (length === 0) return 0;\n\n let left = 0;\n let right = length;\n\n while (left < right) {\n const mid = (left + right) >>> 1;\n if (this.#comparator(this.#buffer.peekAt(mid)!, value) < 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n return left;\n }\n\n upperBound(value: T): number {\n const length = this.#buffer.length;\n if (length === 0) return 0;\n\n let left = 0;\n let right = length;\n\n while (left < right) {\n const mid = (left + right) >>> 1;\n if (this.#comparator(this.#buffer.peekAt(mid)!, value) <= 0) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n return left;\n }\n\n indexOf(value: T, index = 0) {\n const length = this.#buffer.length;\n if (length === 0 || index >= length) return -1;\n\n let left = index;\n let right = length - 1;\n\n while (left <= right) {\n const mid = (left + right) >>> 1;\n const cmp = this.#comparator(this.#buffer.peekAt(mid)!, value);\n\n if (cmp === 0) {\n return mid;\n } else if (cmp < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return -1;\n }\n\n has(value: T): boolean {\n return this.indexOf(value) !== -1;\n }\n\n insert(value: T) {\n const index = this.lowerBound(value);\n this.#buffer.setOne(index, value, true);\n\n return index;\n }\n\n removeOne(index: number) {\n return this.#buffer.removeOne(index);\n }\n\n removeFirst(value: T) {\n const index = this.indexOf(value);\n return this.#buffer.removeOne(index);\n }\n\n remove(index: number, count: number): this {\n this.#buffer.deallocate(index, count);\n\n return this;\n }\n\n iter() {\n return this.#buffer.iter();\n }\n\n [Symbol.iterator](): Iterator<T> {\n return this.#buffer[Symbol.iterator]();\n }\n}\n"],"names":["RingBuffer","BinarySearchArray","constructor","comparator","Symbol","toStringTag","length","at","index","peekAt","lowerBound","value","left","right","mid","upperBound","indexOf","cmp","has","insert","setOne","removeOne","removeFirst","remove","count","deallocate","iter","iterator"],"mappings":"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"}
|
package/build/index.cjs.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { BinarySearchArray } from './binary-search.js';\nexport { RingBuffer } from './ring-buffer.js';\n
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { BinarySearchArray } from './binary-search.js';\nexport { RingBuffer } from './ring-buffer.js';\n"],"names":["BinarySearchArray","RingBuffer"],"mappings":";;;;;;;;;;;QAASA;eAAAA,kCAAiB;;QACjBC;eAAAA,yBAAU;;;iCADe;+BACP"}
|
package/build/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { BinarySearchArray } from './binary-search.js';\nexport { RingBuffer } from './ring-buffer.js';\n
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { BinarySearchArray } from './binary-search.js';\nexport { RingBuffer } from './ring-buffer.js';\n"],"names":["BinarySearchArray","RingBuffer"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AACvD,SAASC,UAAU,QAAQ,mBAAmB"}
|
package/build/ring-buffer.cjs
CHANGED
@@ -17,7 +17,7 @@ class RingBuffer {
|
|
17
17
|
#length = 0;
|
18
18
|
static from(values) {
|
19
19
|
const n = values.length;
|
20
|
-
const ring = new RingBuffer(n);
|
20
|
+
const ring = new RingBuffer(n + 1);
|
21
21
|
for(let i = 0; i < n; i++){
|
22
22
|
ring.#buffer[i] = values[i];
|
23
23
|
}
|
@@ -28,7 +28,7 @@ class RingBuffer {
|
|
28
28
|
}
|
29
29
|
[Symbol.toStringTag] = 'RingBuffer';
|
30
30
|
constructor(capacity = DEFAULT_CAPACITY){
|
31
|
-
const size = Math.max(1 << 32 - Math.clz32(capacity), DEFAULT_CAPACITY);
|
31
|
+
const size = Math.max(1 << 32 - Math.clz32(capacity - 1), DEFAULT_CAPACITY);
|
32
32
|
this.#buffer = new Array(size);
|
33
33
|
this.#mask = size - 1;
|
34
34
|
}
|
@@ -50,6 +50,36 @@ class RingBuffer {
|
|
50
50
|
getTailOffset(index) {
|
51
51
|
return this.#tail + index & this.#mask;
|
52
52
|
}
|
53
|
+
resize(capacity) {
|
54
|
+
const buffer = this.#buffer;
|
55
|
+
const bufferLength = buffer.length;
|
56
|
+
if (bufferLength > capacity && bufferLength >> 1 < capacity) {
|
57
|
+
return false;
|
58
|
+
}
|
59
|
+
const size = Math.max(1 << 32 - Math.clz32(capacity - 1), DEFAULT_CAPACITY);
|
60
|
+
const length = this.#length;
|
61
|
+
if (size < length) {
|
62
|
+
return false;
|
63
|
+
}
|
64
|
+
const head = this.#head;
|
65
|
+
const prevMask = this.#mask;
|
66
|
+
const prevTail = this.#tail;
|
67
|
+
const nextMask = size - 1;
|
68
|
+
const nextTail = head + length & nextMask;
|
69
|
+
const wrapIndex = size > bufferLength ? prevTail < head ? bufferLength - head : length : nextTail < head ? size - head : length;
|
70
|
+
for(let i = length - 1; i >= wrapIndex; i--){
|
71
|
+
const read = head + i & prevMask;
|
72
|
+
const write = head + i & nextMask;
|
73
|
+
buffer[write] = buffer[read];
|
74
|
+
if (read !== write) {
|
75
|
+
buffer[read] = undefined;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
this.#buffer.length = size;
|
79
|
+
this.#tail = nextTail;
|
80
|
+
this.#mask = nextMask;
|
81
|
+
return true;
|
82
|
+
}
|
53
83
|
grow(capacity = this.#mask + 1) {
|
54
84
|
const buffer = this.#buffer;
|
55
85
|
const bufferLength = buffer.length;
|
@@ -60,7 +90,6 @@ class RingBuffer {
|
|
60
90
|
this.#buffer.length = size;
|
61
91
|
const oldTail = this.#tail;
|
62
92
|
if (oldTail < this.#head) {
|
63
|
-
const buffer = this.#buffer;
|
64
93
|
for(let i = 0; i < oldTail; i++){
|
65
94
|
buffer[bufferLength + i] = buffer[i];
|
66
95
|
}
|
@@ -70,9 +99,10 @@ class RingBuffer {
|
|
70
99
|
}
|
71
100
|
allocate(index, count) {
|
72
101
|
const prevLength = this.#length;
|
73
|
-
if (index < 0 ||
|
102
|
+
if (index < 0 || count <= 0) {
|
74
103
|
return false;
|
75
104
|
}
|
105
|
+
index = Math.min(index, prevLength);
|
76
106
|
const buffer = this.#buffer;
|
77
107
|
const head = this.#head;
|
78
108
|
const tail = this.#tail;
|
@@ -280,6 +310,103 @@ class RingBuffer {
|
|
280
310
|
this.#length = write;
|
281
311
|
return true;
|
282
312
|
}
|
313
|
+
set(index, values, insert = false) {
|
314
|
+
const length = this.#length;
|
315
|
+
if (index < 0 || index > length) {
|
316
|
+
return false;
|
317
|
+
}
|
318
|
+
const count = values.length;
|
319
|
+
if (insert) {
|
320
|
+
this.allocate(index, count);
|
321
|
+
} else {
|
322
|
+
const extra = Math.max(index + values.length - length, 0);
|
323
|
+
if (extra > 0) {
|
324
|
+
this.allocate(length, extra);
|
325
|
+
}
|
326
|
+
}
|
327
|
+
const buffer = this.#buffer;
|
328
|
+
const mask = this.#mask;
|
329
|
+
const baseWrite = this.#head + index;
|
330
|
+
for(let i = 0; i < count; i++){
|
331
|
+
buffer[baseWrite + i & mask] = values[i];
|
332
|
+
}
|
333
|
+
return true;
|
334
|
+
}
|
335
|
+
setOne(index, value, insert = false) {
|
336
|
+
const length = this.#length;
|
337
|
+
if (index < 0 || index > length) {
|
338
|
+
return false;
|
339
|
+
}
|
340
|
+
if (insert) {
|
341
|
+
this.allocate(index, 1);
|
342
|
+
} else {
|
343
|
+
const extra = Math.max(index + 1 - length, 0);
|
344
|
+
if (extra > 0) {
|
345
|
+
this.allocate(length, extra);
|
346
|
+
}
|
347
|
+
}
|
348
|
+
const buffer = this.#buffer;
|
349
|
+
const mask = this.#mask;
|
350
|
+
buffer[this.#head + index & mask] = value;
|
351
|
+
return true;
|
352
|
+
}
|
353
|
+
slice(start = 0, end = this.#length) {
|
354
|
+
const length = this.#length;
|
355
|
+
const buffer = this.#buffer;
|
356
|
+
const head = this.#head;
|
357
|
+
const tail = this.#tail;
|
358
|
+
const mask = this.#mask;
|
359
|
+
const actualStart = start < 0 ? Math.max(length + start, 0) : Math.min(start, length);
|
360
|
+
const actualEnd = end < 0 ? Math.max(length + end, 0) : Math.min(end, length);
|
361
|
+
if (head <= tail) {
|
362
|
+
return this.#buffer.slice(head + actualStart & mask, head + actualEnd & mask);
|
363
|
+
}
|
364
|
+
const size = Math.max(actualEnd - actualStart, 0);
|
365
|
+
const result = new Array(size);
|
366
|
+
for(let i = 0; i < size; i++){
|
367
|
+
result[i] = buffer[head + actualStart + i & mask];
|
368
|
+
}
|
369
|
+
return result;
|
370
|
+
}
|
371
|
+
removeOne(index) {
|
372
|
+
const length = this.#length;
|
373
|
+
if (index < 0 || index >= length) {
|
374
|
+
return -1;
|
375
|
+
}
|
376
|
+
const buffer = this.#buffer;
|
377
|
+
const mask = this.#mask;
|
378
|
+
const head = this.#head;
|
379
|
+
const leftMoveCount = index;
|
380
|
+
const rightMoveCount = length - index;
|
381
|
+
if (leftMoveCount < rightMoveCount) {
|
382
|
+
for(let i = index; i > 0; i--){
|
383
|
+
buffer[head + i & mask] = buffer[head + i - 1 & mask];
|
384
|
+
}
|
385
|
+
buffer[head] = undefined;
|
386
|
+
this.#head = head + 1 & mask;
|
387
|
+
} else {
|
388
|
+
for(let i = index; i < length - 1; i++){
|
389
|
+
buffer[head + i & mask] = buffer[head + i + 1 & mask];
|
390
|
+
}
|
391
|
+
const tail = head + length - 1 & mask;
|
392
|
+
buffer[tail] = undefined;
|
393
|
+
this.#tail = tail;
|
394
|
+
}
|
395
|
+
this.#length = length - 1;
|
396
|
+
return index;
|
397
|
+
}
|
398
|
+
removeFirst(value, index = 0) {
|
399
|
+
const foundIndex = this.indexOf(value, index);
|
400
|
+
if (foundIndex === -1) {
|
401
|
+
return -1;
|
402
|
+
}
|
403
|
+
return this.removeOne(foundIndex);
|
404
|
+
}
|
405
|
+
remove(index, count) {
|
406
|
+
const result = this.slice(index, index + count);
|
407
|
+
this.deallocate(index, count);
|
408
|
+
return result;
|
409
|
+
}
|
283
410
|
push(value) {
|
284
411
|
const tail = this.getTailOffset(1);
|
285
412
|
if (tail === this.#head) {
|
@@ -337,59 +464,6 @@ class RingBuffer {
|
|
337
464
|
has(value) {
|
338
465
|
return this.indexOf(value) !== -1;
|
339
466
|
}
|
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
467
|
clear() {
|
394
468
|
this.#buffer.length = 0;
|
395
469
|
this.#buffer.length = DEFAULT_CAPACITY;
|
@@ -399,24 +473,6 @@ class RingBuffer {
|
|
399
473
|
this.#mask = DEFAULT_CAPACITY - 1;
|
400
474
|
return this;
|
401
475
|
}
|
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
476
|
toArray() {
|
421
477
|
return this.slice();
|
422
478
|
}
|
@@ -1 +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":"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"}
|
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 + 1);\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 - 1)), DEFAULT_CAPACITY);\n this.#buffer = new Array<T>(size);\n this.#mask = size - 1;\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 resize(capacity: number): boolean {\n const buffer = this.#buffer;\n const bufferLength = buffer.length;\n if (bufferLength > capacity && bufferLength >> 1 < capacity) {\n return false;\n }\n const size = Math.max(1 << (32 - Math.clz32(capacity - 1)), DEFAULT_CAPACITY);\n const length = this.#length;\n if (size < length) {\n return false;\n }\n const head = this.#head;\n const prevMask = this.#mask;\n const prevTail = this.#tail;\n\n const nextMask = size - 1;\n const nextTail = (head + length) & nextMask;\n\n const wrapIndex = size > bufferLength ? (prevTail < head ? bufferLength - head : length) : nextTail < head ? size - head : length;\n\n for (let i = length - 1; i >= wrapIndex; i--) {\n const read = (head + i) & prevMask;\n const write = (head + i) & nextMask;\n buffer[write] = buffer[read];\n if (read !== write) {\n buffer[read] = undefined;\n }\n }\n\n this.#buffer.length = size;\n this.#tail = nextTail;\n this.#mask = nextMask;\n return true;\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 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 || count <= 0) {\n return false;\n }\n\n // Clamp index to valid range, like Array.splice()\n index = Math.min(index, prevLength);\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 set(index: number, values: T[], insert = false) {\n const length = this.#length;\n if (index < 0 || index > length) {\n return false;\n }\n const count = values.length;\n if (insert) {\n this.allocate(index, count);\n } else {\n const extra = Math.max(index + values.length - length, 0);\n if (extra > 0) {\n this.allocate(length, extra);\n }\n }\n const buffer = this.#buffer;\n const mask = this.#mask;\n const baseWrite = this.#head + index;\n for (let i = 0; i < count; i++) {\n buffer[(baseWrite + i) & mask] = values[i];\n }\n return true;\n }\n\n setOne(index: number, value: T, insert = false) {\n const length = this.#length;\n if (index < 0 || index > length) {\n return false;\n }\n if (insert) {\n this.allocate(index, 1);\n } else {\n const extra = Math.max(index + 1 - length, 0);\n if (extra > 0) {\n this.allocate(length, extra);\n }\n }\n const buffer = this.#buffer;\n const mask = this.#mask;\n buffer[(this.#head + index) & mask] = value;\n\n return true;\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((head + actualStart) & mask, (head + actualEnd) & mask) 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 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, index + count);\n this.deallocate(index, count);\n return result;\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 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 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"],"names":["RingBuffer","DEFAULT_CAPACITY","from","values","n","length","ring","i","Symbol","toStringTag","constructor","capacity","size","Math","max","clz32","Array","isEmpty","isWrapped","getHeadOffset","index","getTailOffset","resize","buffer","bufferLength","head","prevMask","prevTail","nextMask","nextTail","wrapIndex","read","write","undefined","grow","oldTail","allocate","count","prevLength","min","tail","nextLength","mask","isResized","leftMoveCount","rightMoveCount","writeBase","deallocate","actualCount","indexOf","value","offset","result","firstSegmentLength","startOffset","unwrap","prevHead","compact","filter","readOffset","writeOffset","set","insert","extra","baseWrite","setOne","slice","start","end","actualStart","actualEnd","removeOne","removeFirst","foundIndex","remove","push","unshift","shift","pop","peekAt","peekFirst","peekLast","has","clear","toArray","drain","Iterator","iterator","next","done","iter","idx"],"mappings":"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"}
|
package/build/ring-buffer.d.ts
CHANGED
@@ -12,12 +12,19 @@ export declare class RingBuffer<T> {
|
|
12
12
|
isWrapped(): boolean;
|
13
13
|
getHeadOffset(index: number): number;
|
14
14
|
getTailOffset(index: number): number;
|
15
|
+
resize(capacity: number): boolean;
|
15
16
|
grow(capacity?: number): void;
|
16
17
|
allocate(index: number, count: number): boolean;
|
17
18
|
deallocate(index: number, count: number): boolean;
|
18
19
|
indexOf(value: T, index?: number): number;
|
19
20
|
unwrap(): boolean;
|
20
21
|
compact(filter: FilterFunction<T>): boolean;
|
22
|
+
set(index: number, values: T[], insert?: boolean): boolean;
|
23
|
+
setOne(index: number, value: T, insert?: boolean): boolean;
|
24
|
+
slice(start?: number, end?: number): T[];
|
25
|
+
removeOne(index: number): number;
|
26
|
+
removeFirst(value: T, index?: number): number;
|
27
|
+
remove(index: number, count: number): T[];
|
21
28
|
push(value: T): this;
|
22
29
|
unshift(value: T): this;
|
23
30
|
shift(): T | undefined;
|
@@ -26,13 +33,7 @@ export declare class RingBuffer<T> {
|
|
26
33
|
peekFirst(): T | undefined;
|
27
34
|
peekLast(): T | undefined;
|
28
35
|
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
36
|
clear(): this;
|
35
|
-
slice(start?: number, end?: number): T[];
|
36
37
|
toArray(): T[];
|
37
38
|
drain(): IteratorObject<T, void, unknown>;
|
38
39
|
iter(): IteratorObject<T, void, unknown>;
|