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,709 @@
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 DoublyLinkedListNode = class extends LinkedListNode {
352
+ static {
353
+ __name(this, "DoublyLinkedListNode");
354
+ }
355
+ constructor(value) {
356
+ super(value);
357
+ this._value = value;
358
+ this._next = void 0;
359
+ this._prev = void 0;
360
+ }
361
+ _next;
362
+ get next() {
363
+ return this._next;
364
+ }
365
+ set next(value) {
366
+ this._next = value;
367
+ }
368
+ _prev;
369
+ get prev() {
370
+ return this._prev;
371
+ }
372
+ set prev(value) {
373
+ this._prev = value;
374
+ }
375
+ };
376
+ var DoublyLinkedList = class extends LinearLinkedBase {
377
+ static {
378
+ __name(this, "DoublyLinkedList");
379
+ }
380
+ _equals = Object.is;
381
+ constructor(elements = [], options) {
382
+ super(options);
383
+ this._head = void 0;
384
+ this._tail = void 0;
385
+ this._length = 0;
386
+ if (options?.maxLen && Number.isInteger(options.maxLen) && options.maxLen > 0) {
387
+ this._maxLen = options.maxLen;
388
+ }
389
+ this.pushMany(elements);
390
+ }
391
+ _head;
392
+ get head() {
393
+ return this._head;
394
+ }
395
+ _tail;
396
+ get tail() {
397
+ return this._tail;
398
+ }
399
+ _length = 0;
400
+ get length() {
401
+ return this._length;
402
+ }
403
+ get first() {
404
+ return this.head?.value;
405
+ }
406
+ get last() {
407
+ return this.tail?.value;
408
+ }
409
+ static fromArray(data) {
410
+ return new this(data);
411
+ }
412
+ isNode(elementNodeOrPredicate) {
413
+ return elementNodeOrPredicate instanceof DoublyLinkedListNode;
414
+ }
415
+ push(elementOrNode) {
416
+ const newNode = this._ensureNode(elementOrNode);
417
+ if (!this.head) {
418
+ this._head = newNode;
419
+ this._tail = newNode;
420
+ } else {
421
+ newNode.prev = this.tail;
422
+ this.tail.next = newNode;
423
+ this._tail = newNode;
424
+ }
425
+ this._length++;
426
+ if (this._maxLen > 0 && this.length > this._maxLen) this.shift();
427
+ return true;
428
+ }
429
+ pop() {
430
+ if (!this.tail) return void 0;
431
+ const removed = this.tail;
432
+ if (this.head === this.tail) {
433
+ this._head = void 0;
434
+ this._tail = void 0;
435
+ } else {
436
+ this._tail = removed.prev;
437
+ this.tail.next = void 0;
438
+ }
439
+ this._length--;
440
+ return removed.value;
441
+ }
442
+ shift() {
443
+ if (!this.head) return void 0;
444
+ const removed = this.head;
445
+ if (this.head === this.tail) {
446
+ this._head = void 0;
447
+ this._tail = void 0;
448
+ } else {
449
+ this._head = removed.next;
450
+ this.head.prev = void 0;
451
+ }
452
+ this._length--;
453
+ return removed.value;
454
+ }
455
+ unshift(elementOrNode) {
456
+ const newNode = this._ensureNode(elementOrNode);
457
+ if (!this.head) {
458
+ this._head = newNode;
459
+ this._tail = newNode;
460
+ } else {
461
+ newNode.next = this.head;
462
+ this.head.prev = newNode;
463
+ this._head = newNode;
464
+ }
465
+ this._length++;
466
+ if (this._maxLen > 0 && this._length > this._maxLen) this.pop();
467
+ return true;
468
+ }
469
+ pushMany(elements) {
470
+ const ans = [];
471
+ for (const el of elements) {
472
+ if (this.toElementFn) ans.push(this.push(this.toElementFn(el)));
473
+ else ans.push(this.push(el));
474
+ }
475
+ return ans;
476
+ }
477
+ unshiftMany(elements) {
478
+ const ans = [];
479
+ for (const el of elements) {
480
+ if (this.toElementFn) ans.push(this.unshift(this.toElementFn(el)));
481
+ else ans.push(this.unshift(el));
482
+ }
483
+ return ans;
484
+ }
485
+ at(index) {
486
+ if (index < 0 || index >= this._length) return void 0;
487
+ let current = this.head;
488
+ for (let i = 0; i < index; i++) current = current.next;
489
+ return current.value;
490
+ }
491
+ getNodeAt(index) {
492
+ if (index < 0 || index >= this._length) return void 0;
493
+ let current = this.head;
494
+ for (let i = 0; i < index; i++) current = current.next;
495
+ return current;
496
+ }
497
+ getNode(elementNodeOrPredicate) {
498
+ if (elementNodeOrPredicate === void 0) return;
499
+ if (this.isNode(elementNodeOrPredicate)) {
500
+ const target = elementNodeOrPredicate;
501
+ let cur = this.head;
502
+ while (cur) {
503
+ if (cur === target) return target;
504
+ cur = cur.next;
505
+ }
506
+ const isMatch = __name((node) => this._equals(node.value, target.value), "isMatch");
507
+ cur = this.head;
508
+ while (cur) {
509
+ if (isMatch(cur)) return cur;
510
+ cur = cur.next;
511
+ }
512
+ return void 0;
513
+ }
514
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
515
+ let current = this.head;
516
+ while (current) {
517
+ if (predicate(current)) return current;
518
+ current = current.next;
519
+ }
520
+ return void 0;
521
+ }
522
+ addAt(index, newElementOrNode) {
523
+ if (index < 0 || index > this._length) return false;
524
+ if (index === 0) return this.unshift(newElementOrNode);
525
+ if (index === this._length) return this.push(newElementOrNode);
526
+ const newNode = this._ensureNode(newElementOrNode);
527
+ const prevNode = this.getNodeAt(index - 1);
528
+ const nextNode = prevNode.next;
529
+ newNode.prev = prevNode;
530
+ newNode.next = nextNode;
531
+ prevNode.next = newNode;
532
+ nextNode.prev = newNode;
533
+ this._length++;
534
+ return true;
535
+ }
536
+ addBefore(existingElementOrNode, newElementOrNode) {
537
+ const existingNode = this.isNode(existingElementOrNode) ? existingElementOrNode : this.getNode(existingElementOrNode);
538
+ if (!existingNode) return false;
539
+ const newNode = this._ensureNode(newElementOrNode);
540
+ newNode.prev = existingNode.prev;
541
+ if (existingNode.prev) existingNode.prev.next = newNode;
542
+ newNode.next = existingNode;
543
+ existingNode.prev = newNode;
544
+ if (existingNode === this.head) this._head = newNode;
545
+ this._length++;
546
+ return true;
547
+ }
548
+ addAfter(existingElementOrNode, newElementOrNode) {
549
+ const existingNode = this.isNode(existingElementOrNode) ? existingElementOrNode : this.getNode(existingElementOrNode);
550
+ if (!existingNode) return false;
551
+ const newNode = this._ensureNode(newElementOrNode);
552
+ newNode.next = existingNode.next;
553
+ if (existingNode.next) existingNode.next.prev = newNode;
554
+ newNode.prev = existingNode;
555
+ existingNode.next = newNode;
556
+ if (existingNode === this.tail) this._tail = newNode;
557
+ this._length++;
558
+ return true;
559
+ }
560
+ setAt(index, value) {
561
+ const node = this.getNodeAt(index);
562
+ if (!node) return false;
563
+ node.value = value;
564
+ return true;
565
+ }
566
+ deleteAt(index) {
567
+ if (index < 0 || index >= this._length) return;
568
+ if (index === 0) return this.shift();
569
+ if (index === this._length - 1) return this.pop();
570
+ const removedNode = this.getNodeAt(index);
571
+ const prevNode = removedNode.prev;
572
+ const nextNode = removedNode.next;
573
+ prevNode.next = nextNode;
574
+ nextNode.prev = prevNode;
575
+ this._length--;
576
+ return removedNode.value;
577
+ }
578
+ delete(elementOrNode) {
579
+ const node = this.getNode(elementOrNode);
580
+ if (!node) return false;
581
+ if (node === this.head) this.shift();
582
+ else if (node === this.tail) this.pop();
583
+ else {
584
+ const prevNode = node.prev;
585
+ const nextNode = node.next;
586
+ prevNode.next = nextNode;
587
+ nextNode.prev = prevNode;
588
+ this._length--;
589
+ }
590
+ return true;
591
+ }
592
+ isEmpty() {
593
+ return this._length === 0;
594
+ }
595
+ clear() {
596
+ this._head = void 0;
597
+ this._tail = void 0;
598
+ this._length = 0;
599
+ }
600
+ search(elementNodeOrPredicate) {
601
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
602
+ let current = this.head;
603
+ while (current) {
604
+ if (predicate(current)) return current.value;
605
+ current = current.next;
606
+ }
607
+ return void 0;
608
+ }
609
+ getBackward(elementNodeOrPredicate) {
610
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
611
+ let current = this.tail;
612
+ while (current) {
613
+ if (predicate(current)) return current.value;
614
+ current = current.prev;
615
+ }
616
+ return void 0;
617
+ }
618
+ reverse() {
619
+ let current = this.head;
620
+ [this._head, this._tail] = [this.tail, this.head];
621
+ while (current) {
622
+ const next = current.next;
623
+ [current.prev, current.next] = [current.next, current.prev];
624
+ current = next;
625
+ }
626
+ return this;
627
+ }
628
+ setEquality(equals) {
629
+ this._equals = equals;
630
+ return this;
631
+ }
632
+ clone() {
633
+ const out = this._createInstance({ toElementFn: this._toElementFn, maxLen: this._maxLen });
634
+ for (const v of this) out.push(v);
635
+ return out;
636
+ }
637
+ filter(callback, thisArg) {
638
+ const out = this._createInstance({ toElementFn: this._toElementFn, maxLen: this._maxLen });
639
+ let index = 0;
640
+ for (const v of this) if (callback.call(thisArg, v, index++, this)) out.push(v);
641
+ return out;
642
+ }
643
+ mapSame(callback, thisArg) {
644
+ const out = this._createInstance({ toElementFn: this._toElementFn, maxLen: this._maxLen });
645
+ let index = 0;
646
+ for (const v of this) {
647
+ const mv = thisArg === void 0 ? callback(v, index++, this) : callback.call(thisArg, v, index++, this);
648
+ out.push(mv);
649
+ }
650
+ return out;
651
+ }
652
+ map(callback, options, thisArg) {
653
+ const out = this._createLike([], { ...options ?? {}, maxLen: this._maxLen });
654
+ let index = 0;
655
+ for (const v of this) out.push(callback.call(thisArg, v, index++, this));
656
+ return out;
657
+ }
658
+ _ensureNode(elementOrNode) {
659
+ if (this.isNode(elementOrNode)) return elementOrNode;
660
+ return new DoublyLinkedListNode(elementOrNode);
661
+ }
662
+ _ensurePredicate(elementNodeOrPredicate) {
663
+ if (this.isNode(elementNodeOrPredicate)) {
664
+ const target = elementNodeOrPredicate;
665
+ return (node) => node === target;
666
+ }
667
+ if (typeof elementNodeOrPredicate === "function") {
668
+ return elementNodeOrPredicate;
669
+ }
670
+ const value = elementNodeOrPredicate;
671
+ return (node) => this._equals(node.value, value);
672
+ }
673
+ _getPrevNode(node) {
674
+ return node.prev;
675
+ }
676
+ _createInstance(options) {
677
+ const Ctor = this.constructor;
678
+ return new Ctor([], options);
679
+ }
680
+ _createLike(elements = [], options) {
681
+ const Ctor = this.constructor;
682
+ return new Ctor(elements, options);
683
+ }
684
+ *_getIterator() {
685
+ let current = this.head;
686
+ while (current) {
687
+ yield current.value;
688
+ current = current.next;
689
+ }
690
+ }
691
+ *_getReverseIterator() {
692
+ let current = this.tail;
693
+ while (current) {
694
+ yield current.value;
695
+ current = current.prev;
696
+ }
697
+ }
698
+ *_getNodeIterator() {
699
+ let current = this.head;
700
+ while (current) {
701
+ yield current;
702
+ current = current.next;
703
+ }
704
+ }
705
+ };
706
+ export {
707
+ DoublyLinkedList,
708
+ DoublyLinkedListNode
709
+ };