data-structure-typed 2.2.7 → 2.2.8

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +14 -3
  3. package/README_CN.md +119 -275
  4. package/benchmark/report.html +1 -1
  5. package/benchmark/report.json +20 -324
  6. package/dist/cjs/index.cjs +106 -107
  7. package/dist/cjs/index.cjs.map +1 -1
  8. package/dist/cjs-legacy/index.cjs +106 -107
  9. package/dist/cjs-legacy/index.cjs.map +1 -1
  10. package/dist/esm/index.mjs +106 -107
  11. package/dist/esm/index.mjs.map +1 -1
  12. package/dist/esm-legacy/index.mjs +106 -107
  13. package/dist/esm-legacy/index.mjs.map +1 -1
  14. package/dist/leetcode/avl-tree-counter.mjs +2957 -0
  15. package/dist/leetcode/avl-tree-multi-map.mjs +2889 -0
  16. package/dist/leetcode/avl-tree.mjs +2720 -0
  17. package/dist/leetcode/binary-tree.mjs +1594 -0
  18. package/dist/leetcode/bst.mjs +2398 -0
  19. package/dist/leetcode/deque.mjs +683 -0
  20. package/dist/leetcode/directed-graph.mjs +1733 -0
  21. package/dist/leetcode/doubly-linked-list.mjs +709 -0
  22. package/dist/leetcode/hash-map.mjs +493 -0
  23. package/dist/leetcode/heap.mjs +542 -0
  24. package/dist/leetcode/max-heap.mjs +375 -0
  25. package/dist/leetcode/max-priority-queue.mjs +383 -0
  26. package/dist/leetcode/min-heap.mjs +363 -0
  27. package/dist/leetcode/min-priority-queue.mjs +371 -0
  28. package/dist/leetcode/priority-queue.mjs +363 -0
  29. package/dist/leetcode/queue.mjs +943 -0
  30. package/dist/leetcode/red-black-tree.mjs +2765 -0
  31. package/dist/leetcode/singly-linked-list.mjs +754 -0
  32. package/dist/leetcode/stack.mjs +217 -0
  33. package/dist/leetcode/tree-counter.mjs +3039 -0
  34. package/dist/leetcode/tree-multi-map.mjs +2913 -0
  35. package/dist/leetcode/trie.mjs +413 -0
  36. package/dist/leetcode/undirected-graph.mjs +1650 -0
  37. package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +1 -1
  38. package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +2 -2
  39. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +10 -10
  40. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +22 -23
  41. package/dist/types/data-structures/binary-tree/bst.d.ts +11 -11
  42. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +1 -1
  43. package/dist/types/data-structures/binary-tree/tree-counter.d.ts +1 -1
  44. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
  45. package/dist/umd/data-structure-typed.js +102 -103
  46. package/dist/umd/data-structure-typed.js.map +1 -1
  47. package/dist/umd/data-structure-typed.min.js +2 -2
  48. package/dist/umd/data-structure-typed.min.js.map +1 -1
  49. package/package.json +48 -171
  50. package/src/data-structures/binary-tree/avl-tree-counter.ts +6 -6
  51. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +13 -13
  52. package/src/data-structures/binary-tree/avl-tree.ts +15 -15
  53. package/src/data-structures/binary-tree/binary-tree.ts +53 -55
  54. package/src/data-structures/binary-tree/bst.ts +21 -22
  55. package/src/data-structures/binary-tree/red-black-tree.ts +3 -3
  56. package/src/data-structures/binary-tree/tree-counter.ts +4 -4
  57. package/src/data-structures/binary-tree/tree-multi-map.ts +13 -13
  58. package/test/performance/data-structures/binary-tree/red-black-tree.test.ts +1 -2
  59. package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +30 -30
  60. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +46 -46
  61. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +43 -43
  62. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +151 -151
  63. package/test/unit/data-structures/binary-tree/bst.test.ts +99 -99
  64. package/test/unit/data-structures/binary-tree/overall.test.ts +20 -20
  65. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +141 -141
  66. package/test/unit/data-structures/binary-tree/tree-counter.test.ts +37 -37
  67. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +145 -145
  68. package/tsup.config.js +50 -21
  69. package/tsup.umd.config.js +29 -0
  70. package/tsup.node.config.js +0 -83
@@ -0,0 +1,943 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ var IterableElementBase = class {
4
+ static {
5
+ __name(this, "IterableElementBase");
6
+ }
7
+ constructor(options) {
8
+ if (options) {
9
+ const { toElementFn } = options;
10
+ if (typeof toElementFn === "function") this._toElementFn = toElementFn;
11
+ else if (toElementFn) throw new TypeError("toElementFn must be a function type");
12
+ }
13
+ }
14
+ _toElementFn;
15
+ get toElementFn() {
16
+ return this._toElementFn;
17
+ }
18
+ *[Symbol.iterator](...args) {
19
+ yield* this._getIterator(...args);
20
+ }
21
+ *values() {
22
+ for (const item of this) yield item;
23
+ }
24
+ every(predicate, thisArg) {
25
+ let index = 0;
26
+ for (const item of this) {
27
+ if (thisArg === void 0) {
28
+ if (!predicate(item, index++, this)) return false;
29
+ } else {
30
+ const fn = predicate;
31
+ if (!fn.call(thisArg, item, index++, this)) return false;
32
+ }
33
+ }
34
+ return true;
35
+ }
36
+ some(predicate, thisArg) {
37
+ let index = 0;
38
+ for (const item of this) {
39
+ if (thisArg === void 0) {
40
+ if (predicate(item, index++, this)) return true;
41
+ } else {
42
+ const fn = predicate;
43
+ if (fn.call(thisArg, item, index++, this)) return true;
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ forEach(callbackfn, thisArg) {
49
+ let index = 0;
50
+ for (const item of this) {
51
+ if (thisArg === void 0) {
52
+ callbackfn(item, index++, this);
53
+ } else {
54
+ const fn = callbackfn;
55
+ fn.call(thisArg, item, index++, this);
56
+ }
57
+ }
58
+ }
59
+ find(predicate, thisArg) {
60
+ let index = 0;
61
+ for (const item of this) {
62
+ if (thisArg === void 0) {
63
+ if (predicate(item, index++, this)) return item;
64
+ } else {
65
+ const fn = predicate;
66
+ if (fn.call(thisArg, item, index++, this)) return item;
67
+ }
68
+ }
69
+ return;
70
+ }
71
+ has(element) {
72
+ for (const ele of this) if (ele === element) return true;
73
+ return false;
74
+ }
75
+ reduce(callbackfn, initialValue) {
76
+ let index = 0;
77
+ const iter = this[Symbol.iterator]();
78
+ let acc;
79
+ if (arguments.length >= 2) {
80
+ acc = initialValue;
81
+ } else {
82
+ const first = iter.next();
83
+ if (first.done) throw new TypeError("Reduce of empty structure with no initial value");
84
+ acc = first.value;
85
+ index = 1;
86
+ }
87
+ for (const value of iter) {
88
+ acc = callbackfn(acc, value, index++, this);
89
+ }
90
+ return acc;
91
+ }
92
+ toArray() {
93
+ return [...this];
94
+ }
95
+ toVisual() {
96
+ return [...this];
97
+ }
98
+ print() {
99
+ console.log(this.toVisual());
100
+ }
101
+ };
102
+ var LinkedListNode = class {
103
+ static {
104
+ __name(this, "LinkedListNode");
105
+ }
106
+ constructor(value) {
107
+ this._value = value;
108
+ this._next = void 0;
109
+ }
110
+ _value;
111
+ get value() {
112
+ return this._value;
113
+ }
114
+ set value(value) {
115
+ this._value = value;
116
+ }
117
+ _next;
118
+ get next() {
119
+ return this._next;
120
+ }
121
+ set next(value) {
122
+ this._next = value;
123
+ }
124
+ };
125
+ var LinearBase = class _LinearBase extends IterableElementBase {
126
+ static {
127
+ __name(this, "LinearBase");
128
+ }
129
+ constructor(options) {
130
+ super(options);
131
+ if (options) {
132
+ const { maxLen } = options;
133
+ if (typeof maxLen === "number" && maxLen > 0 && maxLen % 1 === 0) this._maxLen = maxLen;
134
+ }
135
+ }
136
+ _maxLen = -1;
137
+ get maxLen() {
138
+ return this._maxLen;
139
+ }
140
+ indexOf(searchElement, fromIndex = 0) {
141
+ if (this.length === 0) return -1;
142
+ if (fromIndex < 0) fromIndex = this.length + fromIndex;
143
+ if (fromIndex < 0) fromIndex = 0;
144
+ for (let i = fromIndex; i < this.length; i++) {
145
+ const element = this.at(i);
146
+ if (element === searchElement) return i;
147
+ }
148
+ return -1;
149
+ }
150
+ lastIndexOf(searchElement, fromIndex = this.length - 1) {
151
+ if (this.length === 0) return -1;
152
+ if (fromIndex >= this.length) fromIndex = this.length - 1;
153
+ if (fromIndex < 0) fromIndex = this.length + fromIndex;
154
+ for (let i = fromIndex; i >= 0; i--) {
155
+ const element = this.at(i);
156
+ if (element === searchElement) return i;
157
+ }
158
+ return -1;
159
+ }
160
+ findIndex(predicate, thisArg) {
161
+ for (let i = 0; i < this.length; i++) {
162
+ const item = this.at(i);
163
+ if (item !== void 0 && predicate.call(thisArg, item, i, this)) return i;
164
+ }
165
+ return -1;
166
+ }
167
+ concat(...items) {
168
+ const newList = this.clone();
169
+ for (const item of items) {
170
+ if (item instanceof _LinearBase) {
171
+ newList.pushMany(item);
172
+ } else {
173
+ newList.push(item);
174
+ }
175
+ }
176
+ return newList;
177
+ }
178
+ sort(compareFn) {
179
+ const arr = this.toArray();
180
+ arr.sort(compareFn);
181
+ this.clear();
182
+ for (const item of arr) this.push(item);
183
+ return this;
184
+ }
185
+ splice(start, deleteCount = 0, ...items) {
186
+ const removedList = this._createInstance();
187
+ start = start < 0 ? this.length + start : start;
188
+ start = Math.max(0, Math.min(start, this.length));
189
+ deleteCount = Math.max(0, Math.min(deleteCount, this.length - start));
190
+ for (let i = 0; i < deleteCount; i++) {
191
+ const removed = this.deleteAt(start);
192
+ if (removed !== void 0) {
193
+ removedList.push(removed);
194
+ }
195
+ }
196
+ for (let i = 0; i < items.length; i++) {
197
+ this.addAt(start + i, items[i]);
198
+ }
199
+ return removedList;
200
+ }
201
+ join(separator = ",") {
202
+ return this.toArray().join(separator);
203
+ }
204
+ toReversedArray() {
205
+ const array = [];
206
+ for (let i = this.length - 1; i >= 0; i--) {
207
+ array.push(this.at(i));
208
+ }
209
+ return array;
210
+ }
211
+ reduceRight(callbackfn, initialValue) {
212
+ let accumulator = initialValue ?? 0;
213
+ for (let i = this.length - 1; i >= 0; i--) {
214
+ accumulator = callbackfn(accumulator, this.at(i), i, this);
215
+ }
216
+ return accumulator;
217
+ }
218
+ slice(start = 0, end = this.length) {
219
+ start = start < 0 ? this.length + start : start;
220
+ end = end < 0 ? this.length + end : end;
221
+ const newList = this._createInstance();
222
+ for (let i = start; i < end; i++) {
223
+ newList.push(this.at(i));
224
+ }
225
+ return newList;
226
+ }
227
+ fill(value, start = 0, end = this.length) {
228
+ start = start < 0 ? this.length + start : start;
229
+ end = end < 0 ? this.length + end : end;
230
+ if (start < 0) start = 0;
231
+ if (end > this.length) end = this.length;
232
+ if (start >= end) return this;
233
+ for (let i = start; i < end; i++) {
234
+ this.setAt(i, value);
235
+ }
236
+ return this;
237
+ }
238
+ };
239
+ var LinearLinkedBase = class extends LinearBase {
240
+ static {
241
+ __name(this, "LinearLinkedBase");
242
+ }
243
+ constructor(options) {
244
+ super(options);
245
+ if (options) {
246
+ const { maxLen } = options;
247
+ if (typeof maxLen === "number" && maxLen > 0 && maxLen % 1 === 0) this._maxLen = maxLen;
248
+ }
249
+ }
250
+ indexOf(searchElement, fromIndex = 0) {
251
+ const iterator = this._getIterator();
252
+ let current = iterator.next();
253
+ let index = 0;
254
+ while (index < fromIndex) {
255
+ current = iterator.next();
256
+ index++;
257
+ }
258
+ while (!current.done) {
259
+ if (current.value === searchElement) return index;
260
+ current = iterator.next();
261
+ index++;
262
+ }
263
+ return -1;
264
+ }
265
+ lastIndexOf(searchElement, fromIndex = this.length - 1) {
266
+ const iterator = this._getReverseIterator();
267
+ let current = iterator.next();
268
+ let index = this.length - 1;
269
+ while (index > fromIndex) {
270
+ current = iterator.next();
271
+ index--;
272
+ }
273
+ while (!current.done) {
274
+ if (current.value === searchElement) return index;
275
+ current = iterator.next();
276
+ index--;
277
+ }
278
+ return -1;
279
+ }
280
+ concat(...items) {
281
+ const newList = this.clone();
282
+ for (const item of items) {
283
+ if (item instanceof LinearBase) {
284
+ newList.pushMany(item);
285
+ } else {
286
+ newList.push(item);
287
+ }
288
+ }
289
+ return newList;
290
+ }
291
+ slice(start = 0, end = this.length) {
292
+ start = start < 0 ? this.length + start : start;
293
+ end = end < 0 ? this.length + end : end;
294
+ const newList = this._createInstance();
295
+ const iterator = this._getIterator();
296
+ let current = iterator.next();
297
+ let c = 0;
298
+ while (c < start) {
299
+ current = iterator.next();
300
+ c++;
301
+ }
302
+ for (let i = start; i < end; i++) {
303
+ newList.push(current.value);
304
+ current = iterator.next();
305
+ }
306
+ return newList;
307
+ }
308
+ splice(start, deleteCount = 0, ...items) {
309
+ const removedList = this._createInstance();
310
+ start = start < 0 ? this.length + start : start;
311
+ start = Math.max(0, Math.min(start, this.length));
312
+ deleteCount = Math.max(0, deleteCount);
313
+ let currentIndex = 0;
314
+ let currentNode = void 0;
315
+ let previousNode = void 0;
316
+ const iterator = this._getNodeIterator();
317
+ for (const node of iterator) {
318
+ if (currentIndex === start) {
319
+ currentNode = node;
320
+ break;
321
+ }
322
+ previousNode = node;
323
+ currentIndex++;
324
+ }
325
+ for (let i = 0; i < deleteCount && currentNode; i++) {
326
+ removedList.push(currentNode.value);
327
+ const nextNode = currentNode.next;
328
+ this.delete(currentNode);
329
+ currentNode = nextNode;
330
+ }
331
+ for (let i = 0; i < items.length; i++) {
332
+ if (previousNode) {
333
+ this.addAfter(previousNode, items[i]);
334
+ previousNode = previousNode.next;
335
+ } else {
336
+ this.addAt(0, items[i]);
337
+ previousNode = this._getNodeIterator().next().value;
338
+ }
339
+ }
340
+ return removedList;
341
+ }
342
+ reduceRight(callbackfn, initialValue) {
343
+ let accumulator = initialValue ?? 0;
344
+ let index = this.length - 1;
345
+ for (const item of this._getReverseIterator()) {
346
+ accumulator = callbackfn(accumulator, item, index--, this);
347
+ }
348
+ return accumulator;
349
+ }
350
+ };
351
+ var SinglyLinkedListNode = class extends LinkedListNode {
352
+ static {
353
+ __name(this, "SinglyLinkedListNode");
354
+ }
355
+ constructor(value) {
356
+ super(value);
357
+ this._value = value;
358
+ this._next = void 0;
359
+ }
360
+ _next;
361
+ get next() {
362
+ return this._next;
363
+ }
364
+ set next(value) {
365
+ this._next = value;
366
+ }
367
+ };
368
+ var SinglyLinkedList = class extends LinearLinkedBase {
369
+ static {
370
+ __name(this, "SinglyLinkedList");
371
+ }
372
+ _equals = Object.is;
373
+ constructor(elements = [], options) {
374
+ super(options);
375
+ this.pushMany(elements);
376
+ }
377
+ _head;
378
+ get head() {
379
+ return this._head;
380
+ }
381
+ _tail;
382
+ get tail() {
383
+ return this._tail;
384
+ }
385
+ _length = 0;
386
+ get length() {
387
+ return this._length;
388
+ }
389
+ get first() {
390
+ return this.head?.value;
391
+ }
392
+ get last() {
393
+ return this.tail?.value;
394
+ }
395
+ static from(data, options) {
396
+ const list = new this([], options);
397
+ for (const x of data) list.push(x);
398
+ return list;
399
+ }
400
+ push(elementOrNode) {
401
+ const newNode = this._ensureNode(elementOrNode);
402
+ if (!this.head) {
403
+ this._head = this._tail = newNode;
404
+ } else {
405
+ this.tail.next = newNode;
406
+ this._tail = newNode;
407
+ }
408
+ this._length++;
409
+ if (this._maxLen > 0 && this.length > this._maxLen) this.shift();
410
+ return true;
411
+ }
412
+ pop() {
413
+ if (!this.head) return void 0;
414
+ if (this.head === this.tail) {
415
+ const value2 = this.head.value;
416
+ this._head = void 0;
417
+ this._tail = void 0;
418
+ this._length--;
419
+ return value2;
420
+ }
421
+ let current = this.head;
422
+ while (current.next !== this.tail) current = current.next;
423
+ const value = this.tail.value;
424
+ current.next = void 0;
425
+ this._tail = current;
426
+ this._length--;
427
+ return value;
428
+ }
429
+ shift() {
430
+ if (!this.head) return void 0;
431
+ const removed = this.head;
432
+ this._head = this.head.next;
433
+ if (!this._head) this._tail = void 0;
434
+ this._length--;
435
+ return removed.value;
436
+ }
437
+ unshift(elementOrNode) {
438
+ const newNode = this._ensureNode(elementOrNode);
439
+ if (!this.head) {
440
+ this._head = this._tail = newNode;
441
+ } else {
442
+ newNode.next = this.head;
443
+ this._head = newNode;
444
+ }
445
+ this._length++;
446
+ return true;
447
+ }
448
+ pushMany(elements) {
449
+ const ans = [];
450
+ for (const el of elements) {
451
+ if (this.toElementFn) ans.push(this.push(this.toElementFn(el)));
452
+ else ans.push(this.push(el));
453
+ }
454
+ return ans;
455
+ }
456
+ unshiftMany(elements) {
457
+ const ans = [];
458
+ for (const el of elements) {
459
+ if (this.toElementFn) ans.push(this.unshift(this.toElementFn(el)));
460
+ else ans.push(this.unshift(el));
461
+ }
462
+ return ans;
463
+ }
464
+ search(elementNodeOrPredicate) {
465
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
466
+ let current = this.head;
467
+ while (current) {
468
+ if (predicate(current)) return current.value;
469
+ current = current.next;
470
+ }
471
+ return void 0;
472
+ }
473
+ at(index) {
474
+ if (index < 0 || index >= this._length) return void 0;
475
+ let current = this.head;
476
+ for (let i = 0; i < index; i++) current = current.next;
477
+ return current.value;
478
+ }
479
+ isNode(elementNodeOrPredicate) {
480
+ return elementNodeOrPredicate instanceof SinglyLinkedListNode;
481
+ }
482
+ getNodeAt(index) {
483
+ if (index < 0 || index >= this._length) return void 0;
484
+ let current = this.head;
485
+ for (let i = 0; i < index; i++) current = current.next;
486
+ return current;
487
+ }
488
+ deleteAt(index) {
489
+ if (index < 0 || index >= this._length) return void 0;
490
+ if (index === 0) return this.shift();
491
+ const targetNode = this.getNodeAt(index);
492
+ const prevNode = this._getPrevNode(targetNode);
493
+ const value = targetNode.value;
494
+ prevNode.next = targetNode.next;
495
+ if (targetNode === this.tail) this._tail = prevNode;
496
+ this._length--;
497
+ return value;
498
+ }
499
+ delete(elementOrNode) {
500
+ if (elementOrNode === void 0 || !this.head) return false;
501
+ const node = this.isNode(elementOrNode) ? elementOrNode : this.getNode(elementOrNode);
502
+ if (!node) return false;
503
+ const prevNode = this._getPrevNode(node);
504
+ if (!prevNode) {
505
+ this._head = node.next;
506
+ if (node === this.tail) this._tail = void 0;
507
+ } else {
508
+ prevNode.next = node.next;
509
+ if (node === this.tail) this._tail = prevNode;
510
+ }
511
+ this._length--;
512
+ return true;
513
+ }
514
+ addAt(index, newElementOrNode) {
515
+ if (index < 0 || index > this._length) return false;
516
+ if (index === 0) return this.unshift(newElementOrNode);
517
+ if (index === this._length) return this.push(newElementOrNode);
518
+ const newNode = this._ensureNode(newElementOrNode);
519
+ const prevNode = this.getNodeAt(index - 1);
520
+ newNode.next = prevNode.next;
521
+ prevNode.next = newNode;
522
+ this._length++;
523
+ return true;
524
+ }
525
+ setAt(index, value) {
526
+ const node = this.getNodeAt(index);
527
+ if (!node) return false;
528
+ node.value = value;
529
+ return true;
530
+ }
531
+ isEmpty() {
532
+ return this._length === 0;
533
+ }
534
+ clear() {
535
+ this._head = void 0;
536
+ this._tail = void 0;
537
+ this._length = 0;
538
+ }
539
+ reverse() {
540
+ if (!this.head || this.head === this.tail) return this;
541
+ let prev;
542
+ let current = this.head;
543
+ let next;
544
+ while (current) {
545
+ next = current.next;
546
+ current.next = prev;
547
+ prev = current;
548
+ current = next;
549
+ }
550
+ [this._head, this._tail] = [this.tail, this.head];
551
+ return this;
552
+ }
553
+ getNode(elementNodeOrPredicate) {
554
+ if (elementNodeOrPredicate === void 0) return;
555
+ if (this.isNode(elementNodeOrPredicate)) return elementNodeOrPredicate;
556
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
557
+ let current = this.head;
558
+ while (current) {
559
+ if (predicate(current)) return current;
560
+ current = current.next;
561
+ }
562
+ return void 0;
563
+ }
564
+ addBefore(existingElementOrNode, newElementOrNode) {
565
+ const existingNode = this.getNode(existingElementOrNode);
566
+ if (!existingNode) return false;
567
+ const prevNode = this._getPrevNode(existingNode);
568
+ const newNode = this._ensureNode(newElementOrNode);
569
+ if (!prevNode) {
570
+ newNode.next = this._head;
571
+ this._head = newNode;
572
+ if (!this._tail) this._tail = newNode;
573
+ this._length++;
574
+ } else {
575
+ prevNode.next = newNode;
576
+ newNode.next = existingNode;
577
+ this._length++;
578
+ }
579
+ return true;
580
+ }
581
+ addAfter(existingElementOrNode, newElementOrNode) {
582
+ const existingNode = this.getNode(existingElementOrNode);
583
+ if (!existingNode) return false;
584
+ const newNode = this._ensureNode(newElementOrNode);
585
+ newNode.next = existingNode.next;
586
+ existingNode.next = newNode;
587
+ if (existingNode === this.tail) this._tail = newNode;
588
+ this._length++;
589
+ return true;
590
+ }
591
+ splice(start, deleteCount = 0, ...items) {
592
+ start = Math.max(0, Math.min(start, this.length));
593
+ deleteCount = Math.max(0, deleteCount);
594
+ const removedList = this._createInstance();
595
+ const prevNode = start === 0 ? void 0 : this.getNodeAt(start - 1);
596
+ let cur = prevNode ? prevNode.next : this.head;
597
+ let removedCount = 0;
598
+ while (removedCount < deleteCount && cur) {
599
+ removedList.push(cur.value);
600
+ cur = cur.next;
601
+ removedCount++;
602
+ }
603
+ const afterNode = cur;
604
+ if (prevNode) {
605
+ prevNode.next = afterNode;
606
+ } else {
607
+ this._head = afterNode;
608
+ }
609
+ if (!afterNode) this._tail = prevNode;
610
+ if (items.length > 0) {
611
+ let firstInserted;
612
+ let lastInserted;
613
+ for (const it of items) {
614
+ const node = this._ensureNode(it);
615
+ if (!firstInserted) firstInserted = node;
616
+ if (lastInserted) lastInserted.next = node;
617
+ lastInserted = node;
618
+ }
619
+ if (prevNode) prevNode.next = firstInserted;
620
+ else this._head = firstInserted;
621
+ lastInserted.next = afterNode;
622
+ if (!afterNode) this._tail = lastInserted;
623
+ }
624
+ this._length += items.length - removedCount;
625
+ if (this._length === 0) {
626
+ this._head = void 0;
627
+ this._tail = void 0;
628
+ }
629
+ return removedList;
630
+ }
631
+ countOccurrences(elementOrNode) {
632
+ const predicate = elementOrPredicate(elementOrNode, this._equals);
633
+ let count = 0;
634
+ let current = this.head;
635
+ while (current) {
636
+ if (predicate(current)) count++;
637
+ current = current.next;
638
+ }
639
+ return count;
640
+ }
641
+ setEquality(equals) {
642
+ this._equals = equals;
643
+ return this;
644
+ }
645
+ deleteWhere(predicate) {
646
+ let prev;
647
+ let current = this.head;
648
+ let i = 0;
649
+ while (current) {
650
+ if (predicate(current.value, i++, this)) {
651
+ if (!prev) {
652
+ this._head = current.next;
653
+ if (current === this._tail) this._tail = void 0;
654
+ } else {
655
+ prev.next = current.next;
656
+ if (current === this._tail) this._tail = prev;
657
+ }
658
+ this._length--;
659
+ return true;
660
+ }
661
+ prev = current;
662
+ current = current.next;
663
+ }
664
+ return false;
665
+ }
666
+ clone() {
667
+ const out = this._createInstance();
668
+ for (const v of this) out.push(v);
669
+ return out;
670
+ }
671
+ filter(callback, thisArg) {
672
+ const out = this._createInstance();
673
+ let index = 0;
674
+ for (const value of this) if (callback.call(thisArg, value, index++, this)) out.push(value);
675
+ return out;
676
+ }
677
+ mapSame(callback, thisArg) {
678
+ const out = this._createInstance();
679
+ let index = 0;
680
+ for (const value of this) {
681
+ const mv = thisArg === void 0 ? callback(value, index++, this) : callback.call(thisArg, value, index++, this);
682
+ out.push(mv);
683
+ }
684
+ return out;
685
+ }
686
+ map(callback, options, thisArg) {
687
+ const out = this._createLike([], { ...options ?? {}, maxLen: this._maxLen });
688
+ let index = 0;
689
+ for (const value of this) out.push(callback.call(thisArg, value, index++, this));
690
+ return out;
691
+ }
692
+ createNode(value) {
693
+ return new SinglyLinkedListNode(value);
694
+ }
695
+ _isPredicate(elementNodeOrPredicate) {
696
+ return typeof elementNodeOrPredicate === "function";
697
+ }
698
+ _ensureNode(elementOrNode) {
699
+ if (this.isNode(elementOrNode)) return elementOrNode;
700
+ return this.createNode(elementOrNode);
701
+ }
702
+ _ensurePredicate(elementNodeOrPredicate) {
703
+ if (this.isNode(elementNodeOrPredicate)) return (node) => node === elementNodeOrPredicate;
704
+ if (this._isPredicate(elementNodeOrPredicate)) return elementNodeOrPredicate;
705
+ const value = elementNodeOrPredicate;
706
+ return (node) => this._equals(node.value, value);
707
+ }
708
+ _getPrevNode(node) {
709
+ if (!this.head || this.head === node) return void 0;
710
+ let current = this.head;
711
+ while (current.next && current.next !== node) current = current.next;
712
+ return current.next === node ? current : void 0;
713
+ }
714
+ *_getIterator() {
715
+ let current = this.head;
716
+ while (current) {
717
+ yield current.value;
718
+ current = current.next;
719
+ }
720
+ }
721
+ *_getReverseIterator() {
722
+ const reversedArr = [...this].reverse();
723
+ for (const item of reversedArr) yield item;
724
+ }
725
+ *_getNodeIterator() {
726
+ let current = this.head;
727
+ while (current) {
728
+ yield current;
729
+ current = current.next;
730
+ }
731
+ }
732
+ _createInstance(options) {
733
+ const Ctor = this.constructor;
734
+ return new Ctor([], options);
735
+ }
736
+ _createLike(elements = [], options) {
737
+ const Ctor = this.constructor;
738
+ return new Ctor(elements, options);
739
+ }
740
+ _spawnLike(options) {
741
+ return this._createLike([], options);
742
+ }
743
+ };
744
+ function elementOrPredicate(input, equals) {
745
+ if (input instanceof SinglyLinkedListNode) return (node) => node === input;
746
+ if (typeof input === "function") return input;
747
+ const value = input;
748
+ return (node) => equals(node.value, value);
749
+ }
750
+ __name(elementOrPredicate, "elementOrPredicate");
751
+ var Queue = class _Queue extends LinearBase {
752
+ static {
753
+ __name(this, "Queue");
754
+ }
755
+ constructor(elements = [], options) {
756
+ super(options);
757
+ if (options) {
758
+ const { autoCompactRatio = 0.5 } = options;
759
+ this._autoCompactRatio = autoCompactRatio;
760
+ }
761
+ this.pushMany(elements);
762
+ }
763
+ _elements = [];
764
+ get elements() {
765
+ return this._elements;
766
+ }
767
+ _offset = 0;
768
+ get offset() {
769
+ return this._offset;
770
+ }
771
+ _autoCompactRatio = 0.5;
772
+ get autoCompactRatio() {
773
+ return this._autoCompactRatio;
774
+ }
775
+ set autoCompactRatio(value) {
776
+ this._autoCompactRatio = value;
777
+ }
778
+ get length() {
779
+ return this.elements.length - this._offset;
780
+ }
781
+ get first() {
782
+ return this.length > 0 ? this.elements[this._offset] : void 0;
783
+ }
784
+ get last() {
785
+ return this.length > 0 ? this.elements[this.elements.length - 1] : void 0;
786
+ }
787
+ static fromArray(elements) {
788
+ return new _Queue(elements);
789
+ }
790
+ isEmpty() {
791
+ return this.length === 0;
792
+ }
793
+ push(element) {
794
+ this.elements.push(element);
795
+ if (this._maxLen > 0 && this.length > this._maxLen) this.shift();
796
+ return true;
797
+ }
798
+ pushMany(elements) {
799
+ const ans = [];
800
+ for (const el of elements) {
801
+ if (this.toElementFn) ans.push(this.push(this.toElementFn(el)));
802
+ else ans.push(this.push(el));
803
+ }
804
+ return ans;
805
+ }
806
+ shift() {
807
+ if (this.length === 0) return void 0;
808
+ const first = this.first;
809
+ this._offset += 1;
810
+ if (this.elements.length > 0 && this.offset / this.elements.length > this.autoCompactRatio) this.compact();
811
+ return first;
812
+ }
813
+ delete(element) {
814
+ for (let i = this._offset; i < this.elements.length; i++) {
815
+ if (Object.is(this.elements[i], element)) {
816
+ this.elements.splice(i, 1);
817
+ return true;
818
+ }
819
+ }
820
+ return false;
821
+ }
822
+ at(index) {
823
+ if (index < 0 || index >= this.length) return void 0;
824
+ return this._elements[this._offset + index];
825
+ }
826
+ deleteAt(index) {
827
+ if (index < 0 || index >= this.length) return void 0;
828
+ const gi = this._offset + index;
829
+ const [deleted] = this.elements.splice(gi, 1);
830
+ return deleted;
831
+ }
832
+ addAt(index, newElement) {
833
+ if (index < 0 || index > this.length) return false;
834
+ this._elements.splice(this._offset + index, 0, newElement);
835
+ return true;
836
+ }
837
+ setAt(index, newElement) {
838
+ if (index < 0 || index >= this.length) return false;
839
+ this._elements[this._offset + index] = newElement;
840
+ return true;
841
+ }
842
+ reverse() {
843
+ this._elements = this.elements.slice(this._offset).reverse();
844
+ this._offset = 0;
845
+ return this;
846
+ }
847
+ clear() {
848
+ this._elements = [];
849
+ this._offset = 0;
850
+ }
851
+ compact() {
852
+ this._elements = this.elements.slice(this._offset);
853
+ this._offset = 0;
854
+ return true;
855
+ }
856
+ splice(start, deleteCount = 0, ...items) {
857
+ start = Math.max(0, Math.min(start, this.length));
858
+ deleteCount = Math.max(0, Math.min(deleteCount, this.length - start));
859
+ const gi = this._offset + start;
860
+ const removedArray = this._elements.splice(gi, deleteCount, ...items);
861
+ if (this.elements.length > 0 && this.offset / this.elements.length > this.autoCompactRatio) this.compact();
862
+ const removed = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });
863
+ removed._setAutoCompactRatio(this._autoCompactRatio);
864
+ removed.pushMany(removedArray);
865
+ return removed;
866
+ }
867
+ clone() {
868
+ const out = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });
869
+ out._setAutoCompactRatio(this._autoCompactRatio);
870
+ for (let i = this._offset; i < this.elements.length; i++) out.push(this.elements[i]);
871
+ return out;
872
+ }
873
+ filter(predicate, thisArg) {
874
+ const out = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });
875
+ out._setAutoCompactRatio(this._autoCompactRatio);
876
+ let index = 0;
877
+ for (const v of this) {
878
+ if (predicate.call(thisArg, v, index, this)) out.push(v);
879
+ index++;
880
+ }
881
+ return out;
882
+ }
883
+ map(callback, options, thisArg) {
884
+ const out = new this.constructor([], {
885
+ toElementFn: options?.toElementFn,
886
+ maxLen: options?.maxLen ?? this._maxLen,
887
+ autoCompactRatio: options?.autoCompactRatio ?? this._autoCompactRatio
888
+ });
889
+ let index = 0;
890
+ for (const v of this)
891
+ out.push(thisArg === void 0 ? callback(v, index++, this) : callback.call(thisArg, v, index++, this));
892
+ return out;
893
+ }
894
+ mapSame(callback, thisArg) {
895
+ const Ctor = this.constructor;
896
+ const out = new Ctor([], {
897
+ toElementFn: this.toElementFn,
898
+ maxLen: this._maxLen,
899
+ autoCompactRatio: this._autoCompactRatio
900
+ });
901
+ out._setAutoCompactRatio?.(this._autoCompactRatio);
902
+ let index = 0;
903
+ for (const v of this) {
904
+ const mv = thisArg === void 0 ? callback(v, index++, this) : callback.call(thisArg, v, index++, this);
905
+ out.push(mv);
906
+ }
907
+ return out;
908
+ }
909
+ _setAutoCompactRatio(value) {
910
+ this._autoCompactRatio = value;
911
+ }
912
+ *_getIterator() {
913
+ for (let i = this._offset; i < this.elements.length; i++) yield this.elements[i];
914
+ }
915
+ *_getReverseIterator() {
916
+ for (let i = this.length - 1; i >= 0; i--) {
917
+ const cur = this.at(i);
918
+ if (cur !== void 0) yield cur;
919
+ }
920
+ }
921
+ _createInstance(options) {
922
+ const Ctor = this.constructor;
923
+ return new Ctor([], options);
924
+ }
925
+ _createLike(elements = [], options) {
926
+ const Ctor = this.constructor;
927
+ return new Ctor(elements, options);
928
+ }
929
+ };
930
+ var LinkedListQueue = class extends SinglyLinkedList {
931
+ static {
932
+ __name(this, "LinkedListQueue");
933
+ }
934
+ clone() {
935
+ const out = this._createInstance({ toElementFn: this.toElementFn, maxLen: this._maxLen });
936
+ for (const v of this) out.push(v);
937
+ return out;
938
+ }
939
+ };
940
+ export {
941
+ LinkedListQueue,
942
+ Queue
943
+ };