graph-typed 2.5.0 → 2.5.2

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 (90) hide show
  1. package/dist/cjs/index.cjs +1314 -227
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs-legacy/index.cjs +1297 -210
  4. package/dist/cjs-legacy/index.cjs.map +1 -1
  5. package/dist/esm/index.mjs +1314 -228
  6. package/dist/esm/index.mjs.map +1 -1
  7. package/dist/esm-legacy/index.mjs +1297 -211
  8. package/dist/esm-legacy/index.mjs.map +1 -1
  9. package/dist/types/common/error.d.ts +9 -0
  10. package/dist/types/common/index.d.ts +1 -1
  11. package/dist/types/data-structures/base/index.d.ts +1 -0
  12. package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
  13. package/dist/types/data-structures/base/linear-base.d.ts +3 -3
  14. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +288 -0
  15. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +336 -0
  16. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +618 -18
  17. package/dist/types/data-structures/binary-tree/bst.d.ts +676 -1
  18. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +456 -0
  19. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +144 -1
  20. package/dist/types/data-structures/binary-tree/tree-map.d.ts +3307 -399
  21. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3285 -360
  22. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2674 -325
  23. package/dist/types/data-structures/binary-tree/tree-set.d.ts +3072 -287
  24. package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
  25. package/dist/types/data-structures/graph/directed-graph.d.ts +240 -0
  26. package/dist/types/data-structures/graph/undirected-graph.d.ts +216 -0
  27. package/dist/types/data-structures/hash/hash-map.d.ts +274 -10
  28. package/dist/types/data-structures/heap/heap.d.ts +336 -0
  29. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +411 -3
  30. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +363 -3
  31. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +434 -2
  32. package/dist/types/data-structures/matrix/matrix.d.ts +192 -0
  33. package/dist/types/data-structures/queue/deque.d.ts +364 -4
  34. package/dist/types/data-structures/queue/queue.d.ts +288 -0
  35. package/dist/types/data-structures/stack/stack.d.ts +240 -0
  36. package/dist/types/data-structures/trie/trie.d.ts +292 -4
  37. package/dist/types/interfaces/graph.d.ts +1 -1
  38. package/dist/types/types/common.d.ts +2 -2
  39. package/dist/types/types/data-structures/binary-tree/bst.d.ts +1 -0
  40. package/dist/types/types/data-structures/binary-tree/tree-map.d.ts +5 -0
  41. package/dist/types/types/data-structures/binary-tree/tree-multi-set.d.ts +4 -0
  42. package/dist/types/types/data-structures/binary-tree/tree-set.d.ts +4 -0
  43. package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
  44. package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
  45. package/dist/types/types/utils/validate-type.d.ts +4 -4
  46. package/dist/umd/graph-typed.js +1291 -205
  47. package/dist/umd/graph-typed.js.map +1 -1
  48. package/dist/umd/graph-typed.min.js +3 -3
  49. package/dist/umd/graph-typed.min.js.map +1 -1
  50. package/package.json +2 -2
  51. package/src/common/error.ts +19 -1
  52. package/src/common/index.ts +1 -1
  53. package/src/data-structures/base/index.ts +1 -0
  54. package/src/data-structures/base/iterable-element-base.ts +3 -2
  55. package/src/data-structures/base/iterable-entry-base.ts +8 -8
  56. package/src/data-structures/base/linear-base.ts +3 -3
  57. package/src/data-structures/binary-tree/avl-tree.ts +299 -0
  58. package/src/data-structures/binary-tree/binary-indexed-tree.ts +341 -5
  59. package/src/data-structures/binary-tree/binary-tree.ts +606 -6
  60. package/src/data-structures/binary-tree/bst.ts +946 -7
  61. package/src/data-structures/binary-tree/red-black-tree.ts +472 -0
  62. package/src/data-structures/binary-tree/segment-tree.ts +145 -2
  63. package/src/data-structures/binary-tree/tree-map.ts +3423 -499
  64. package/src/data-structures/binary-tree/tree-multi-map.ts +3537 -596
  65. package/src/data-structures/binary-tree/tree-multi-set.ts +2855 -495
  66. package/src/data-structures/binary-tree/tree-set.ts +3209 -413
  67. package/src/data-structures/graph/abstract-graph.ts +6 -6
  68. package/src/data-structures/graph/directed-graph.ts +240 -0
  69. package/src/data-structures/graph/undirected-graph.ts +216 -0
  70. package/src/data-structures/hash/hash-map.ts +281 -19
  71. package/src/data-structures/heap/heap.ts +340 -4
  72. package/src/data-structures/heap/max-heap.ts +2 -2
  73. package/src/data-structures/linked-list/doubly-linked-list.ts +411 -3
  74. package/src/data-structures/linked-list/singly-linked-list.ts +363 -3
  75. package/src/data-structures/linked-list/skip-linked-list.ts +439 -7
  76. package/src/data-structures/matrix/matrix.ts +202 -10
  77. package/src/data-structures/priority-queue/max-priority-queue.ts +2 -2
  78. package/src/data-structures/queue/deque.ts +365 -5
  79. package/src/data-structures/queue/queue.ts +288 -0
  80. package/src/data-structures/stack/stack.ts +240 -0
  81. package/src/data-structures/trie/trie.ts +295 -7
  82. package/src/interfaces/graph.ts +1 -1
  83. package/src/types/common.ts +2 -2
  84. package/src/types/data-structures/binary-tree/bst.ts +1 -0
  85. package/src/types/data-structures/binary-tree/tree-map.ts +6 -0
  86. package/src/types/data-structures/binary-tree/tree-multi-set.ts +5 -0
  87. package/src/types/data-structures/binary-tree/tree-set.ts +5 -0
  88. package/src/types/data-structures/heap/heap.ts +1 -0
  89. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
  90. package/src/types/utils/validate-type.ts +4 -4
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { Comparator } from '../../types';
11
11
  import type { TreeSetElementCallback, TreeSetOptions, TreeSetRangeOptions, TreeSetReduceCallback } from '../../types';
12
- import { ERR } from '../../common';
12
+ import { ERR, raise } from '../../common';
13
13
  import { RedBlackTree } from './red-black-tree';
14
14
 
15
15
  /**
@@ -50,7 +50,7 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
50
50
  this.#isDefaultComparator = options.comparator === undefined;
51
51
 
52
52
  // RedBlackTree expects an iterable of keys/entries/nodes/raws; for TreeSet we only accept keys.
53
- this.#core = new RedBlackTree<K, undefined>([], { comparator, isMapMode: options.isMapMode });
53
+ this.#core = new RedBlackTree<K, undefined>([], { comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
54
54
 
55
55
  for (const item of elements) {
56
56
  const k = toElementFn ? toElementFn(item as R) : item as K;
@@ -73,7 +73,7 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
73
73
  // numbers
74
74
  if (typeof a === 'number' && typeof b === 'number') {
75
75
  /* istanbul ignore next -- _validateKey prevents NaN from entering the tree */
76
- if (Number.isNaN(a) || Number.isNaN(b)) throw new TypeError(ERR.invalidNaN('TreeSet'));
76
+ if (Number.isNaN(a) || Number.isNaN(b)) raise(TypeError, ERR.invalidNaN('TreeSet'));
77
77
  const aa = Object.is(a, -0) ? 0 : a;
78
78
  const bb = Object.is(b, -0) ? 0 : b;
79
79
  return aa > bb ? 1 : aa < bb ? -1 : 0;
@@ -87,11 +87,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
87
87
  const ta = a.getTime();
88
88
  const tb = b.getTime();
89
89
  /* istanbul ignore next -- _validateKey prevents invalid Date from entering the tree */
90
- if (Number.isNaN(ta) || Number.isNaN(tb)) throw new TypeError(ERR.invalidDate('TreeSet'));
90
+ if (Number.isNaN(ta) || Number.isNaN(tb)) raise(TypeError, ERR.invalidDate('TreeSet'));
91
91
  return ta > tb ? 1 : ta < tb ? -1 : 0;
92
92
  }
93
93
 
94
- throw new TypeError(ERR.comparatorRequired('TreeSet'));
94
+ raise(TypeError, ERR.comparatorRequired('TreeSet'));
95
95
  };
96
96
  }
97
97
 
@@ -142,36 +142,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
142
142
 
143
143
 
144
144
 
145
- * @example
146
- * // Check empty
147
- * console.log(new TreeSet().isEmpty()); // true;
148
- */
149
- isEmpty(): boolean {
150
- return this.size === 0;
151
- }
152
-
153
- private _validateKey(key: K): void {
154
- if (!this.#isDefaultComparator) return;
155
-
156
- if (typeof key === 'number') {
157
- if (Number.isNaN(key)) throw new TypeError(ERR.invalidNaN('TreeSet'));
158
- return;
159
- }
160
-
161
- if (typeof key === 'string') return;
162
-
163
- if (key instanceof Date) {
164
- if (Number.isNaN(key.getTime())) throw new TypeError(ERR.invalidDate('TreeSet'));
165
- return;
166
- }
167
-
168
- // Other key types should have provided a comparator, so reaching here means misuse.
169
- throw new TypeError(ERR.comparatorRequired('TreeSet'));
170
- }
171
-
172
- /**
173
- * Add a key to the set (no-op if already present).
174
- * @remarks Expected time O(log n)
175
145
 
176
146
 
177
147
 
@@ -213,28 +183,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
213
183
 
214
184
 
215
185
 
216
- * @example
217
- * // Unique tags with sorted order
218
- * const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
219
- *
220
- * // Duplicates removed, sorted alphabetically
221
- * console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
222
- * console.log(tags.size); // 4;
223
- *
224
- * tags.add('angular');
225
- * console.log(tags.first()); // 'angular';
226
- * console.log(tags.last()); // 'typescript';
227
- */
228
- add(key: K): this {
229
- this._validateKey(key);
230
- // RBT.set returns boolean; Set.add returns this.
231
- this.#core.set(key, undefined);
232
- return this;
233
- }
234
-
235
- /**
236
- * Test whether a key exists.
237
- * @remarks Expected time O(log n)
238
186
 
239
187
 
240
188
 
@@ -284,22 +232,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
284
232
 
285
233
 
286
234
 
287
- * @example
288
- * // Checking membership in a sorted collection
289
- * const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
290
- *
291
- * console.log(allowed.has('admin')); // true;
292
- * console.log(allowed.has('guest')); // false;
293
- */
294
- has(key: K): boolean {
295
- this._validateKey(key);
296
- return this.#core.has(key);
297
- }
298
-
299
- /**
300
- * Delete a key.
301
- * @returns `true` if the key existed; otherwise `false`.
302
- * @remarks Expected time O(log n)
303
235
 
304
236
 
305
237
 
@@ -330,6 +262,36 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
330
262
 
331
263
 
332
264
 
265
+ * @example
266
+ * // Check empty
267
+ * console.log(new TreeSet().isEmpty()); // true;
268
+ */
269
+ isEmpty(): boolean {
270
+ return this.size === 0;
271
+ }
272
+
273
+ private _validateKey(key: K): void {
274
+ if (!this.#isDefaultComparator) return;
275
+
276
+ if (typeof key === 'number') {
277
+ if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeSet'));
278
+ return;
279
+ }
280
+
281
+ if (typeof key === 'string') return;
282
+
283
+ if (key instanceof Date) {
284
+ if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeSet'));
285
+ return;
286
+ }
287
+
288
+ // Other key types should have provided a comparator, so reaching here means misuse.
289
+ raise(TypeError, ERR.comparatorRequired('TreeSet'));
290
+ }
291
+
292
+ /**
293
+ * Add a key to the set (no-op if already present).
294
+ * @remarks Expected time O(log n)
333
295
 
334
296
 
335
297
 
@@ -349,22 +311,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
349
311
 
350
312
 
351
313
 
352
- * @example
353
- * // Removing elements while maintaining order
354
- * const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
355
- *
356
- * console.log(nums.delete(5)); // true;
357
- * console.log(nums.delete(5)); // false; // already gone
358
- * console.log([...nums]); // [1, 3, 7, 9];
359
- */
360
- delete(key: K): boolean {
361
- this._validateKey(key);
362
- const res = this.#core.delete(key);
363
- return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
364
- }
365
-
366
- /**
367
- * Remove all keys.
368
314
 
369
315
 
370
316
 
@@ -403,18 +349,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
403
349
 
404
350
 
405
351
 
406
- * @example
407
- * // Remove all
408
- * const ts = new TreeSet<number>([1, 2]);
409
- * ts.clear();
410
- * console.log(ts.isEmpty()); // true;
411
- */
412
- clear(): void {
413
- this.#core.clear();
414
- }
415
-
416
- /**
417
- * Iterate over keys in ascending order.
418
352
 
419
353
 
420
354
 
@@ -453,19 +387,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
453
387
 
454
388
 
455
389
 
456
- * @example
457
- * // Get sorted keys
458
- * const ts = new TreeSet<number>([30, 10, 20]);
459
- * console.log([...ts.keys()]); // [10, 20, 30];
460
- */
461
- keys(): IterableIterator<K> {
462
- return this.#core.keys();
463
- }
464
-
465
- /**
466
- * Iterate over values in ascending order.
467
- *
468
- * Note: for Set-like containers, `values()` is the same as `keys()`.
469
390
 
470
391
 
471
392
 
@@ -504,19 +425,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
504
425
 
505
426
 
506
427
 
507
- * @example
508
- * // Get values (same as keys for Set)
509
- * const ts = new TreeSet<number>([2, 1, 3]);
510
- * console.log([...ts.values()]); // [1, 2, 3];
511
- */
512
- values(): IterableIterator<K> {
513
- return this.keys();
514
- }
515
-
516
- /**
517
- * Iterate over `[value, value]` pairs (native Set convention).
518
- *
519
- * Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
520
428
 
521
429
 
522
430
 
@@ -545,6 +453,35 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
545
453
 
546
454
 
547
455
 
456
+ * @example
457
+ * // Unique tags with sorted order
458
+ * const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
459
+ *
460
+ * // Duplicates removed, sorted alphabetically
461
+ * console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
462
+ * console.log(tags.size); // 4;
463
+ *
464
+ * tags.add('angular');
465
+ * console.log(tags.first()); // 'angular';
466
+ * console.log(tags.last()); // 'typescript';
467
+ */
468
+ add(key: K): this {
469
+ this._validateKey(key);
470
+ // RBT.set returns boolean; Set.add returns this.
471
+ this.#core.set(key, undefined);
472
+ return this;
473
+ }
474
+
475
+ /**
476
+ * Test whether a key exists.
477
+ * @remarks Expected time O(log n)
478
+
479
+
480
+
481
+
482
+
483
+
484
+
548
485
 
549
486
 
550
487
 
@@ -555,23 +492,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
555
492
 
556
493
 
557
494
 
558
- * @example
559
- * // Iterate entries
560
- * const ts = new TreeSet<number>([3, 1, 2]);
561
- * console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
562
- */
563
- *entries(): IterableIterator<[K, K]> {
564
- for (const k of this.keys()) yield [k, k];
565
- }
566
-
567
- [Symbol.iterator](): IterableIterator<K> {
568
- return this.keys();
569
- }
570
-
571
- /**
572
- * Visit each value in ascending order.
573
- *
574
- * Callback follows native Set convention: `(value, value2, set)`.
575
495
 
576
496
 
577
497
 
@@ -610,22 +530,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
610
530
 
611
531
 
612
532
 
613
- * @example
614
- * // Execute for each
615
- * const ts = new TreeSet<number>([3, 1, 2]);
616
- * const keys: number[] = [];
617
- * ts.forEach(k => keys.push(k));
618
- * console.log(keys); // [1, 2, 3];
619
- */
620
- forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: any): void {
621
- for (const k of this) cb.call(thisArg, k, k, this);
622
- }
623
-
624
- /**
625
- * Create a new TreeSet by mapping each value to a new key.
626
- *
627
- * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
628
- * @remarks Time O(n log n) expected, Space O(n)
629
533
 
630
534
 
631
535
 
@@ -664,31 +568,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
664
568
 
665
569
 
666
570
 
667
- * @example
668
- * // Transform
669
- * const ts = new TreeSet<number>([1, 2, 3]);
670
- * const doubled = ts.map(k => k * 2);
671
- * console.log([...doubled]); // [2, 4, 6];
672
- */
673
- map<MK>(
674
- callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
675
- options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
676
- thisArg?: unknown
677
- ): TreeSet<MK> {
678
- const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
679
- let index = 0;
680
- for (const v of this) {
681
- const mk = thisArg === undefined
682
- ? callbackfn(v, index++, this)
683
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
684
- out.add(mk);
685
- }
686
- return out;
687
- }
688
-
689
- /**
690
- * Create a new TreeSet containing only values that satisfy the predicate.
691
- * @remarks Time O(n log n) expected, Space O(n)
692
571
 
693
572
 
694
573
 
@@ -727,27 +606,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
727
606
 
728
607
 
729
608
 
730
- * @example
731
- * // Filter
732
- * const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
733
- * const evens = ts.filter(k => k % 2 === 0);
734
- * console.log([...evens]); // [2, 4];
735
- */
736
- filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
737
- const out = new TreeSet<K>([], { comparator: this.#userComparator });
738
- let index = 0;
739
- for (const v of this) {
740
- const ok = thisArg === undefined
741
- ? callbackfn(v, index++, this)
742
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
743
- if (ok) out.add(v);
744
- }
745
- return out;
746
- }
747
-
748
- /**
749
- * Reduce values into a single accumulator.
750
- * @remarks Time O(n), Space O(1)
751
609
 
752
610
 
753
611
 
@@ -787,21 +645,44 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
787
645
 
788
646
 
789
647
  * @example
790
- * // Aggregate
791
- * const ts = new TreeSet<number>([1, 2, 3]);
792
- * const sum = ts.reduce((acc, k) => acc + k, 0);
793
- * console.log(sum); // 6;
648
+ * // Checking membership in a sorted collection
649
+ * const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
650
+ *
651
+ * console.log(allowed.has('admin')); // true;
652
+ * console.log(allowed.has('guest')); // false;
794
653
  */
795
- reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
796
- let acc = initialValue;
797
- let index = 0;
798
- for (const v of this) acc = callbackfn(acc, v, index++, this);
799
- return acc;
654
+ has(key: K): boolean {
655
+ this._validateKey(key);
656
+ return this.#core.has(key);
800
657
  }
801
658
 
802
659
  /**
803
- * Test whether all values satisfy a predicate.
804
- * @remarks Time O(n), Space O(1)
660
+ * Delete a key.
661
+ * @returns `true` if the key existed; otherwise `false`.
662
+ * @remarks Expected time O(log n)
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+
805
686
 
806
687
 
807
688
 
@@ -838,25 +719,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
838
719
 
839
720
 
840
721
 
841
- * @example
842
- * // Test all
843
- * const ts = new TreeSet<number>([2, 4, 6]);
844
- * console.log(ts.every(k => k > 0)); // true;
845
- */
846
- every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
847
- let index = 0;
848
- for (const v of this) {
849
- const ok = thisArg === undefined
850
- ? callbackfn(v, index++, this)
851
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
852
- if (!ok) return false;
853
- }
854
- return true;
855
- }
856
-
857
- /**
858
- * Test whether any value satisfies a predicate.
859
- * @remarks Time O(n), Space O(1)
860
722
 
861
723
 
862
724
 
@@ -893,25 +755,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
893
755
 
894
756
 
895
757
 
896
- * @example
897
- * // Test any
898
- * const ts = new TreeSet<number>([1, 3, 5]);
899
- * console.log(ts.some(k => k === 3)); // true;
900
- */
901
- some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
902
- let index = 0;
903
- for (const v of this) {
904
- const ok = thisArg === undefined
905
- ? callbackfn(v, index++, this)
906
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
907
- if (ok) return true;
908
- }
909
- return false;
910
- }
911
-
912
- /**
913
- * Find the first value that satisfies a predicate.
914
- * @remarks Time O(n), Space O(1)
915
758
 
916
759
 
917
760
 
@@ -948,26 +791,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
948
791
 
949
792
 
950
793
 
951
- * @example
952
- * // Find entry
953
- * const ts = new TreeSet<number>([1, 2, 3]);
954
- * const found = ts.find(k => k === 2);
955
- * console.log(found); // 2;
956
- */
957
- find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
958
- let index = 0;
959
- for (const v of this) {
960
- const ok = thisArg === undefined
961
- ? callbackfn(v, index++, this)
962
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
963
- if (ok) return v;
964
- }
965
- return undefined;
966
- }
967
-
968
- /**
969
- * Materialize the set into an array of keys.
970
- * @remarks Time O(n), Space O(n)
971
794
 
972
795
 
973
796
 
@@ -1007,17 +830,21 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1007
830
 
1008
831
 
1009
832
  * @example
1010
- * // Convert to array
1011
- * const ts = new TreeSet<number>([3, 1, 2]);
1012
- * console.log(ts.toArray()); // [1, 2, 3];
833
+ * // Removing elements while maintaining order
834
+ * const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
835
+ *
836
+ * console.log(nums.delete(5)); // true;
837
+ * console.log(nums.delete(5)); // false; // already gone
838
+ * console.log([...nums]); // [1, 3, 7, 9];
1013
839
  */
1014
- toArray(): K[] {
1015
- return [...this];
840
+ delete(key: K): boolean {
841
+ this._validateKey(key);
842
+ const res = this.#core.delete(key);
843
+ return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
1016
844
  }
1017
845
 
1018
846
  /**
1019
- * Print a human-friendly representation.
1020
- * @remarks Time O(n), Space O(n)
847
+ * Remove all keys.
1021
848
 
1022
849
 
1023
850
 
@@ -1056,20 +883,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1056
883
 
1057
884
 
1058
885
 
1059
- * @example
1060
- * // Display tree
1061
- * const ts = new TreeSet<number>([1, 2, 3]);
1062
- * expect(() => ts.print()).not.toThrow();
1063
- */
1064
- print(): void {
1065
- // Delegate to the underlying tree's visualization.
1066
- this.#core.print();
1067
- }
1068
-
1069
- // Navigable operations
1070
-
1071
- /**
1072
- * Smallest key in the set.
1073
886
 
1074
887
 
1075
888
 
@@ -1081,40 +894,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1081
894
 
1082
895
 
1083
896
 
1084
- * @example
1085
- * // Student grade ranking with custom comparator
1086
- * interface Student {
1087
- * name: string;
1088
- * gpa: number;
1089
- * }
1090
- *
1091
- * const ranking = new TreeSet<Student>(
1092
- * [
1093
- * { name: 'Alice', gpa: 3.8 },
1094
- * { name: 'Bob', gpa: 3.5 },
1095
- * { name: 'Charlie', gpa: 3.9 },
1096
- * { name: 'Diana', gpa: 3.5 }
1097
- * ],
1098
- * { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
1099
- * );
1100
- *
1101
- * // Sorted by GPA descending, then name ascending
1102
- * const names = [...ranking].map(s => s.name);
1103
- * console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
1104
- *
1105
- * // Top student
1106
- * console.log(ranking.first()?.name); // 'Charlie';
1107
- *
1108
- * // Filter students with GPA >= 3.8
1109
- * const honors = ranking.filter(s => s.gpa >= 3.8);
1110
- * console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
1111
- */
1112
- first(): K | undefined {
1113
- return this.#core.getLeftMost();
1114
- }
1115
-
1116
- /**
1117
- * Largest key in the set.
1118
897
 
1119
898
 
1120
899
 
@@ -1126,18 +905,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1126
905
 
1127
906
 
1128
907
 
1129
- * @example
1130
- * // Get the maximum element
1131
- * const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
1132
- * console.log(temps.last()); // 30;
1133
- * console.log(temps.first()); // 15;
1134
- */
1135
- last(): K | undefined {
1136
- return this.#core.getRightMost();
1137
- }
1138
-
1139
- /**
1140
- * Remove and return the smallest key.
1141
908
 
1142
909
 
1143
910
 
@@ -1149,23 +916,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1149
916
 
1150
917
 
1151
918
 
1152
- * @example
1153
- * // Remove and return minimum
1154
- * const queue = new TreeSet<number>([5, 1, 8, 3]);
1155
- *
1156
- * console.log(queue.pollFirst()); // 1;
1157
- * console.log(queue.pollFirst()); // 3;
1158
- * console.log(queue.size); // 2;
1159
- */
1160
- pollFirst(): K | undefined {
1161
- const k = this.first();
1162
- if (k === undefined) return undefined;
1163
- this.delete(k);
1164
- return k;
1165
- }
1166
-
1167
- /**
1168
- * Remove and return the largest key.
1169
919
 
1170
920
 
1171
921
 
@@ -1177,22 +927,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1177
927
 
1178
928
 
1179
929
 
1180
- * @example
1181
- * // Remove and return maximum
1182
- * const stack = new TreeSet<number>([10, 20, 30]);
1183
- *
1184
- * console.log(stack.pollLast()); // 30;
1185
- * console.log(stack.size); // 2;
1186
- */
1187
- pollLast(): K | undefined {
1188
- const k = this.last();
1189
- if (k === undefined) return undefined;
1190
- this.delete(k);
1191
- return k;
1192
- }
1193
-
1194
- /**
1195
- * Smallest key that is >= the given key.
1196
930
 
1197
931
 
1198
932
 
@@ -1231,30 +965,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1231
965
 
1232
966
 
1233
967
 
1234
- * @example
1235
- * // Finding nearest available time slot
1236
- * // Available appointment times (minutes from midnight)
1237
- * const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
1238
- *
1239
- * // Customer wants something around 10:30 (630 min)
1240
- * const nearest = slots.ceiling(630);
1241
- * console.log(nearest); // 660; // 11:00 AM
1242
- *
1243
- * // What's the latest slot before 2:00 PM (840)?
1244
- * const before2pm = slots.lower(840);
1245
- * console.log(before2pm); // 720; // 12:00 PM
1246
- *
1247
- * // Book the 11:00 slot
1248
- * slots.delete(660);
1249
- * console.log(slots.ceiling(630)); // 720;
1250
- */
1251
- ceiling(key: K): K | undefined {
1252
- this._validateKey(key);
1253
- return this.#core.ceiling(key);
1254
- }
1255
-
1256
- /**
1257
- * Largest key that is <= the given key.
1258
968
 
1259
969
 
1260
970
 
@@ -1294,21 +1004,17 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1294
1004
 
1295
1005
 
1296
1006
  * @example
1297
- * // Largest element ≤ target
1298
- * const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
1299
- *
1300
- * // Current width is 800 → which breakpoint applies?
1301
- * console.log(breakpoints.floor(800)); // 768;
1302
- * console.log(breakpoints.floor(1024)); // 1024; // exact match
1303
- * console.log(breakpoints.floor(100)); // undefined;
1007
+ * // Remove all
1008
+ * const ts = new TreeSet<number>([1, 2]);
1009
+ * ts.clear();
1010
+ * console.log(ts.isEmpty()); // true;
1304
1011
  */
1305
- floor(key: K): K | undefined {
1306
- this._validateKey(key);
1307
- return this.#core.floor(key);
1012
+ clear(): void {
1013
+ this.#core.clear();
1308
1014
  }
1309
1015
 
1310
1016
  /**
1311
- * Smallest key that is > the given key.
1017
+ * Iterate over keys in ascending order.
1312
1018
 
1313
1019
 
1314
1020
 
@@ -1347,9 +1053,2727 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1347
1053
 
1348
1054
 
1349
1055
 
1350
- * @example
1351
- * // Smallest element strictly > target
1352
- * const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
1056
+
1057
+
1058
+
1059
+
1060
+
1061
+
1062
+
1063
+
1064
+
1065
+
1066
+
1067
+
1068
+
1069
+
1070
+
1071
+
1072
+
1073
+
1074
+
1075
+
1076
+
1077
+
1078
+
1079
+
1080
+
1081
+
1082
+
1083
+
1084
+
1085
+
1086
+
1087
+
1088
+
1089
+
1090
+
1091
+
1092
+
1093
+
1094
+
1095
+
1096
+
1097
+
1098
+
1099
+
1100
+
1101
+
1102
+
1103
+
1104
+
1105
+
1106
+
1107
+
1108
+
1109
+
1110
+
1111
+
1112
+
1113
+
1114
+
1115
+
1116
+
1117
+
1118
+
1119
+
1120
+
1121
+
1122
+
1123
+
1124
+
1125
+
1126
+
1127
+
1128
+
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+
1151
+
1152
+
1153
+
1154
+
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+ * @example
1177
+ * // Get sorted keys
1178
+ * const ts = new TreeSet<number>([30, 10, 20]);
1179
+ * console.log([...ts.keys()]); // [10, 20, 30];
1180
+ */
1181
+ keys(): IterableIterator<K> {
1182
+ return this.#core.keys();
1183
+ }
1184
+
1185
+ /**
1186
+ * Iterate over values in ascending order.
1187
+ *
1188
+ * Note: for Set-like containers, `values()` is the same as `keys()`.
1189
+
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+
1228
+
1229
+
1230
+
1231
+
1232
+
1233
+
1234
+
1235
+
1236
+
1237
+
1238
+
1239
+
1240
+
1241
+
1242
+
1243
+
1244
+
1245
+
1246
+
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+
1256
+
1257
+
1258
+
1259
+
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+
1301
+
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+
1312
+
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+
1345
+
1346
+
1347
+ * @example
1348
+ * // Get values (same as keys for Set)
1349
+ * const ts = new TreeSet<number>([2, 1, 3]);
1350
+ * console.log([...ts.values()]); // [1, 2, 3];
1351
+ */
1352
+ values(): IterableIterator<K> {
1353
+ return this.keys();
1354
+ }
1355
+
1356
+ /**
1357
+ * Iterate over `[value, value]` pairs (native Set convention).
1358
+ *
1359
+ * Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
1360
+
1361
+
1362
+
1363
+
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+
1380
+
1381
+
1382
+
1383
+
1384
+
1385
+
1386
+
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+
1400
+
1401
+
1402
+
1403
+
1404
+
1405
+
1406
+
1407
+
1408
+
1409
+
1410
+
1411
+
1412
+
1413
+
1414
+
1415
+
1416
+
1417
+
1418
+
1419
+
1420
+
1421
+
1422
+
1423
+
1424
+
1425
+
1426
+
1427
+
1428
+
1429
+
1430
+
1431
+
1432
+
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+
1443
+
1444
+
1445
+
1446
+
1447
+
1448
+
1449
+
1450
+
1451
+
1452
+
1453
+
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+
1472
+
1473
+
1474
+
1475
+
1476
+
1477
+
1478
+
1479
+
1480
+
1481
+
1482
+
1483
+
1484
+
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+
1491
+
1492
+
1493
+
1494
+
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+
1502
+
1503
+
1504
+
1505
+
1506
+
1507
+
1508
+
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+
1516
+
1517
+
1518
+ * @example
1519
+ * // Iterate entries
1520
+ * const ts = new TreeSet<number>([3, 1, 2]);
1521
+ * console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
1522
+ */
1523
+ *entries(): IterableIterator<[K, K]> {
1524
+ for (const k of this.keys()) yield [k, k];
1525
+ }
1526
+
1527
+ [Symbol.iterator](): IterableIterator<K> {
1528
+ return this.keys();
1529
+ }
1530
+
1531
+ /**
1532
+ * Visit each value in ascending order.
1533
+ *
1534
+ * Callback follows native Set convention: `(value, value2, set)`.
1535
+
1536
+
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+
1544
+
1545
+
1546
+
1547
+
1548
+
1549
+
1550
+
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+
1566
+
1567
+
1568
+
1569
+
1570
+
1571
+
1572
+
1573
+
1574
+
1575
+
1576
+
1577
+
1578
+
1579
+
1580
+
1581
+
1582
+
1583
+
1584
+
1585
+
1586
+
1587
+
1588
+
1589
+
1590
+
1591
+
1592
+
1593
+
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+
1621
+
1622
+
1623
+
1624
+
1625
+
1626
+
1627
+
1628
+
1629
+
1630
+
1631
+
1632
+
1633
+
1634
+
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+
1647
+
1648
+
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+
1659
+
1660
+
1661
+
1662
+
1663
+
1664
+
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+
1687
+
1688
+
1689
+
1690
+
1691
+
1692
+
1693
+ * @example
1694
+ * // Execute for each
1695
+ * const ts = new TreeSet<number>([3, 1, 2]);
1696
+ * const keys: number[] = [];
1697
+ * ts.forEach(k => keys.push(k));
1698
+ * console.log(keys); // [1, 2, 3];
1699
+ */
1700
+ forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: unknown): void {
1701
+ for (const k of this) cb.call(thisArg, k, k, this);
1702
+ }
1703
+
1704
+ /**
1705
+ * Create a new TreeSet by mapping each value to a new key.
1706
+ *
1707
+ * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
1708
+ * @remarks Time O(n log n) expected, Space O(n)
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+
1715
+
1716
+
1717
+
1718
+
1719
+
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+
1733
+
1734
+
1735
+
1736
+
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+
1743
+
1744
+
1745
+
1746
+
1747
+
1748
+
1749
+
1750
+
1751
+
1752
+
1753
+
1754
+
1755
+
1756
+
1757
+
1758
+
1759
+
1760
+
1761
+
1762
+
1763
+
1764
+
1765
+
1766
+
1767
+
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+
1800
+
1801
+
1802
+
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+
1813
+
1814
+
1815
+
1816
+
1817
+
1818
+
1819
+
1820
+
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+
1827
+
1828
+
1829
+
1830
+
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+
1844
+
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+
1855
+
1856
+
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+ * @example
1868
+ * // Transform
1869
+ * const ts = new TreeSet<number>([1, 2, 3]);
1870
+ * const doubled = ts.map(k => k * 2);
1871
+ * console.log([...doubled]); // [2, 4, 6];
1872
+ */
1873
+ map<MK>(
1874
+ callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
1875
+ options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
1876
+ thisArg?: unknown
1877
+ ): TreeSet<MK> {
1878
+ const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
1879
+ let index = 0;
1880
+ for (const v of this) {
1881
+ const mk = thisArg === undefined
1882
+ ? callbackfn(v, index++, this)
1883
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
1884
+ out.add(mk);
1885
+ }
1886
+ return out;
1887
+ }
1888
+
1889
+ /**
1890
+ * Create a new TreeSet containing only values that satisfy the predicate.
1891
+ * @remarks Time O(n log n) expected, Space O(n)
1892
+
1893
+
1894
+
1895
+
1896
+
1897
+
1898
+
1899
+
1900
+
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+
1908
+
1909
+
1910
+
1911
+
1912
+
1913
+
1914
+
1915
+
1916
+
1917
+
1918
+
1919
+
1920
+
1921
+
1922
+
1923
+
1924
+
1925
+
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+
1933
+
1934
+
1935
+
1936
+
1937
+
1938
+
1939
+
1940
+
1941
+
1942
+
1943
+
1944
+
1945
+
1946
+
1947
+
1948
+
1949
+
1950
+
1951
+
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+
1972
+
1973
+
1974
+
1975
+
1976
+
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+
1986
+
1987
+
1988
+
1989
+
1990
+
1991
+
1992
+
1993
+
1994
+
1995
+
1996
+
1997
+
1998
+
1999
+
2000
+
2001
+
2002
+
2003
+
2004
+
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+
2013
+
2014
+
2015
+
2016
+
2017
+
2018
+
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+
2040
+
2041
+
2042
+
2043
+
2044
+
2045
+
2046
+
2047
+
2048
+
2049
+
2050
+ * @example
2051
+ * // Filter
2052
+ * const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
2053
+ * const evens = ts.filter(k => k % 2 === 0);
2054
+ * console.log([...evens]); // [2, 4];
2055
+ */
2056
+ filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
2057
+ const out = new TreeSet<K>([], { comparator: this.#userComparator });
2058
+ let index = 0;
2059
+ for (const v of this) {
2060
+ const ok = thisArg === undefined
2061
+ ? callbackfn(v, index++, this)
2062
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
2063
+ if (ok) out.add(v);
2064
+ }
2065
+ return out;
2066
+ }
2067
+
2068
+ /**
2069
+ * Reduce values into a single accumulator.
2070
+ * @remarks Time O(n), Space O(1)
2071
+
2072
+
2073
+
2074
+
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+
2085
+
2086
+
2087
+
2088
+
2089
+
2090
+
2091
+
2092
+
2093
+
2094
+
2095
+
2096
+
2097
+
2098
+
2099
+
2100
+
2101
+
2102
+
2103
+
2104
+
2105
+
2106
+
2107
+
2108
+
2109
+
2110
+
2111
+
2112
+
2113
+
2114
+
2115
+
2116
+
2117
+
2118
+
2119
+
2120
+
2121
+
2122
+
2123
+
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+
2133
+
2134
+
2135
+
2136
+
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+
2152
+
2153
+
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+
2161
+
2162
+
2163
+
2164
+
2165
+
2166
+
2167
+
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+
2175
+
2176
+
2177
+
2178
+
2179
+
2180
+
2181
+
2182
+
2183
+
2184
+
2185
+
2186
+
2187
+
2188
+
2189
+
2190
+
2191
+
2192
+
2193
+
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+
2203
+
2204
+
2205
+
2206
+
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+
2217
+
2218
+
2219
+
2220
+
2221
+
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+ * @example
2230
+ * // Aggregate
2231
+ * const ts = new TreeSet<number>([1, 2, 3]);
2232
+ * const sum = ts.reduce((acc, k) => acc + k, 0);
2233
+ * console.log(sum); // 6;
2234
+ */
2235
+ reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
2236
+ let acc = initialValue;
2237
+ let index = 0;
2238
+ for (const v of this) acc = callbackfn(acc, v, index++, this);
2239
+ return acc;
2240
+ }
2241
+
2242
+ /**
2243
+ * Test whether all values satisfy a predicate.
2244
+ * @remarks Time O(n), Space O(1)
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+
2259
+
2260
+
2261
+
2262
+
2263
+
2264
+
2265
+
2266
+
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+
2279
+
2280
+
2281
+
2282
+
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+
2289
+
2290
+
2291
+
2292
+
2293
+
2294
+
2295
+
2296
+
2297
+
2298
+
2299
+
2300
+
2301
+
2302
+
2303
+
2304
+
2305
+
2306
+
2307
+
2308
+
2309
+
2310
+
2311
+
2312
+
2313
+
2314
+
2315
+
2316
+
2317
+
2318
+
2319
+
2320
+
2321
+
2322
+
2323
+
2324
+
2325
+
2326
+
2327
+
2328
+
2329
+
2330
+
2331
+
2332
+
2333
+
2334
+
2335
+
2336
+
2337
+
2338
+
2339
+
2340
+
2341
+
2342
+
2343
+
2344
+
2345
+
2346
+
2347
+
2348
+
2349
+
2350
+
2351
+
2352
+
2353
+
2354
+
2355
+
2356
+
2357
+
2358
+
2359
+
2360
+
2361
+
2362
+
2363
+
2364
+
2365
+
2366
+
2367
+
2368
+
2369
+
2370
+
2371
+
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+
2382
+
2383
+
2384
+
2385
+
2386
+
2387
+
2388
+
2389
+
2390
+
2391
+
2392
+
2393
+
2394
+
2395
+
2396
+
2397
+
2398
+
2399
+
2400
+
2401
+ * @example
2402
+ * // Test all
2403
+ * const ts = new TreeSet<number>([2, 4, 6]);
2404
+ * console.log(ts.every(k => k > 0)); // true;
2405
+ */
2406
+ every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
2407
+ let index = 0;
2408
+ for (const v of this) {
2409
+ const ok = thisArg === undefined
2410
+ ? callbackfn(v, index++, this)
2411
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
2412
+ if (!ok) return false;
2413
+ }
2414
+ return true;
2415
+ }
2416
+
2417
+ /**
2418
+ * Test whether any value satisfies a predicate.
2419
+ * @remarks Time O(n), Space O(1)
2420
+
2421
+
2422
+
2423
+
2424
+
2425
+
2426
+
2427
+
2428
+
2429
+
2430
+
2431
+
2432
+
2433
+
2434
+
2435
+
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+
2450
+
2451
+
2452
+
2453
+
2454
+
2455
+
2456
+
2457
+
2458
+
2459
+
2460
+
2461
+
2462
+
2463
+
2464
+
2465
+
2466
+
2467
+
2468
+
2469
+
2470
+
2471
+
2472
+
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+
2479
+
2480
+
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+
2488
+
2489
+
2490
+
2491
+
2492
+
2493
+
2494
+
2495
+
2496
+
2497
+
2498
+
2499
+
2500
+
2501
+
2502
+
2503
+
2504
+
2505
+
2506
+
2507
+
2508
+
2509
+
2510
+
2511
+
2512
+
2513
+
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+
2528
+
2529
+
2530
+
2531
+
2532
+
2533
+
2534
+
2535
+
2536
+
2537
+
2538
+
2539
+
2540
+
2541
+
2542
+
2543
+
2544
+
2545
+
2546
+
2547
+
2548
+
2549
+
2550
+
2551
+
2552
+
2553
+
2554
+
2555
+
2556
+
2557
+
2558
+
2559
+
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+
2566
+
2567
+
2568
+
2569
+
2570
+
2571
+
2572
+
2573
+
2574
+
2575
+
2576
+ * @example
2577
+ * // Test any
2578
+ * const ts = new TreeSet<number>([1, 3, 5]);
2579
+ * console.log(ts.some(k => k === 3)); // true;
2580
+ */
2581
+ some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
2582
+ let index = 0;
2583
+ for (const v of this) {
2584
+ const ok = thisArg === undefined
2585
+ ? callbackfn(v, index++, this)
2586
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
2587
+ if (ok) return true;
2588
+ }
2589
+ return false;
2590
+ }
2591
+
2592
+ /**
2593
+ * Find the first value that satisfies a predicate.
2594
+ * @remarks Time O(n), Space O(1)
2595
+
2596
+
2597
+
2598
+
2599
+
2600
+
2601
+
2602
+
2603
+
2604
+
2605
+
2606
+
2607
+
2608
+
2609
+
2610
+
2611
+
2612
+
2613
+
2614
+
2615
+
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+
2626
+
2627
+
2628
+
2629
+
2630
+
2631
+
2632
+
2633
+
2634
+
2635
+
2636
+
2637
+
2638
+
2639
+
2640
+
2641
+
2642
+
2643
+
2644
+
2645
+
2646
+
2647
+
2648
+
2649
+
2650
+
2651
+
2652
+
2653
+
2654
+
2655
+
2656
+
2657
+
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+
2682
+
2683
+
2684
+
2685
+
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+
2692
+
2693
+
2694
+
2695
+
2696
+
2697
+
2698
+
2699
+
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2722
+
2723
+
2724
+
2725
+
2726
+
2727
+
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+
2738
+
2739
+
2740
+
2741
+
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2748
+
2749
+
2750
+
2751
+ * @example
2752
+ * // Find entry
2753
+ * const ts = new TreeSet<number>([1, 2, 3]);
2754
+ * const found = ts.find(k => k === 2);
2755
+ * console.log(found); // 2;
2756
+ */
2757
+ find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
2758
+ let index = 0;
2759
+ for (const v of this) {
2760
+ const ok = thisArg === undefined
2761
+ ? callbackfn(v, index++, this)
2762
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
2763
+ if (ok) return v;
2764
+ }
2765
+ return undefined;
2766
+ }
2767
+
2768
+ /**
2769
+ * Materialize the set into an array of keys.
2770
+ * @remarks Time O(n), Space O(n)
2771
+
2772
+
2773
+
2774
+
2775
+
2776
+
2777
+
2778
+
2779
+
2780
+
2781
+
2782
+
2783
+
2784
+
2785
+
2786
+
2787
+
2788
+
2789
+
2790
+
2791
+
2792
+
2793
+
2794
+
2795
+
2796
+
2797
+
2798
+
2799
+
2800
+
2801
+
2802
+
2803
+
2804
+
2805
+
2806
+
2807
+
2808
+
2809
+
2810
+
2811
+
2812
+
2813
+
2814
+
2815
+
2816
+
2817
+
2818
+
2819
+
2820
+
2821
+
2822
+
2823
+
2824
+
2825
+
2826
+
2827
+
2828
+
2829
+
2830
+
2831
+
2832
+
2833
+
2834
+
2835
+
2836
+
2837
+
2838
+
2839
+
2840
+
2841
+
2842
+
2843
+
2844
+
2845
+
2846
+
2847
+
2848
+
2849
+
2850
+
2851
+
2852
+
2853
+
2854
+
2855
+
2856
+
2857
+
2858
+
2859
+
2860
+
2861
+
2862
+
2863
+
2864
+
2865
+
2866
+
2867
+
2868
+
2869
+
2870
+
2871
+
2872
+
2873
+
2874
+
2875
+
2876
+
2877
+
2878
+
2879
+
2880
+
2881
+
2882
+
2883
+
2884
+
2885
+
2886
+
2887
+
2888
+
2889
+
2890
+
2891
+
2892
+
2893
+
2894
+
2895
+
2896
+
2897
+
2898
+
2899
+
2900
+
2901
+
2902
+
2903
+
2904
+
2905
+
2906
+
2907
+
2908
+
2909
+
2910
+
2911
+
2912
+
2913
+
2914
+
2915
+
2916
+
2917
+
2918
+
2919
+
2920
+
2921
+
2922
+
2923
+
2924
+
2925
+
2926
+
2927
+
2928
+
2929
+ * @example
2930
+ * // Convert to array
2931
+ * const ts = new TreeSet<number>([3, 1, 2]);
2932
+ * console.log(ts.toArray()); // [1, 2, 3];
2933
+ */
2934
+ toArray(): K[] {
2935
+ return [...this];
2936
+ }
2937
+
2938
+ /**
2939
+ * Print a human-friendly representation.
2940
+ * @remarks Time O(n), Space O(n)
2941
+
2942
+
2943
+
2944
+
2945
+
2946
+
2947
+
2948
+
2949
+
2950
+
2951
+
2952
+
2953
+
2954
+
2955
+
2956
+
2957
+
2958
+
2959
+
2960
+
2961
+
2962
+
2963
+
2964
+
2965
+
2966
+
2967
+
2968
+
2969
+
2970
+
2971
+
2972
+
2973
+
2974
+
2975
+
2976
+
2977
+
2978
+
2979
+
2980
+
2981
+
2982
+
2983
+
2984
+
2985
+
2986
+
2987
+
2988
+
2989
+
2990
+
2991
+
2992
+
2993
+
2994
+
2995
+
2996
+
2997
+
2998
+
2999
+
3000
+
3001
+
3002
+
3003
+
3004
+
3005
+
3006
+
3007
+
3008
+
3009
+
3010
+
3011
+
3012
+
3013
+
3014
+
3015
+
3016
+
3017
+
3018
+
3019
+
3020
+
3021
+
3022
+
3023
+
3024
+
3025
+
3026
+
3027
+
3028
+
3029
+
3030
+
3031
+
3032
+
3033
+
3034
+
3035
+
3036
+
3037
+
3038
+
3039
+
3040
+
3041
+
3042
+
3043
+
3044
+
3045
+
3046
+
3047
+
3048
+
3049
+
3050
+
3051
+
3052
+
3053
+
3054
+
3055
+
3056
+
3057
+
3058
+
3059
+
3060
+
3061
+
3062
+
3063
+
3064
+
3065
+
3066
+
3067
+
3068
+
3069
+
3070
+
3071
+
3072
+
3073
+
3074
+
3075
+
3076
+
3077
+
3078
+
3079
+
3080
+
3081
+
3082
+
3083
+
3084
+
3085
+
3086
+
3087
+
3088
+
3089
+
3090
+
3091
+
3092
+
3093
+
3094
+
3095
+
3096
+
3097
+
3098
+
3099
+ * @example
3100
+ * // Display tree
3101
+ * const ts = new TreeSet<number>([1, 2, 3]);
3102
+ * expect(() => ts.print()).not.toThrow();
3103
+ */
3104
+ print(): void {
3105
+ // Delegate to the underlying tree's visualization.
3106
+ this.#core.print();
3107
+ }
3108
+
3109
+ // Navigable operations
3110
+
3111
+ /**
3112
+ * Smallest key in the set.
3113
+
3114
+
3115
+
3116
+
3117
+
3118
+
3119
+
3120
+
3121
+
3122
+
3123
+
3124
+
3125
+
3126
+
3127
+
3128
+
3129
+
3130
+
3131
+
3132
+
3133
+
3134
+
3135
+
3136
+
3137
+
3138
+
3139
+
3140
+
3141
+
3142
+
3143
+
3144
+
3145
+
3146
+
3147
+
3148
+ * @example
3149
+ * // Student grade ranking with custom comparator
3150
+ * interface Student {
3151
+ * name: string;
3152
+ * gpa: number;
3153
+ * }
3154
+ *
3155
+ * const ranking = new TreeSet<Student>(
3156
+ * [
3157
+ * { name: 'Alice', gpa: 3.8 },
3158
+ * { name: 'Bob', gpa: 3.5 },
3159
+ * { name: 'Charlie', gpa: 3.9 },
3160
+ * { name: 'Diana', gpa: 3.5 }
3161
+ * ],
3162
+ * { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
3163
+ * );
3164
+ *
3165
+ * // Sorted by GPA descending, then name ascending
3166
+ * const names = [...ranking].map(s => s.name);
3167
+ * console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
3168
+ *
3169
+ * // Top student
3170
+ * console.log(ranking.first()?.name); // 'Charlie';
3171
+ *
3172
+ * // Filter students with GPA >= 3.8
3173
+ * const honors = ranking.filter(s => s.gpa >= 3.8);
3174
+ * console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
3175
+ */
3176
+ first(): K | undefined {
3177
+ return this.#core.getLeftMost();
3178
+ }
3179
+
3180
+ /**
3181
+ * Largest key in the set.
3182
+
3183
+
3184
+
3185
+
3186
+
3187
+
3188
+
3189
+
3190
+
3191
+
3192
+
3193
+
3194
+
3195
+
3196
+
3197
+
3198
+
3199
+
3200
+
3201
+
3202
+
3203
+
3204
+
3205
+
3206
+
3207
+
3208
+
3209
+
3210
+
3211
+
3212
+
3213
+
3214
+
3215
+
3216
+
3217
+ * @example
3218
+ * // Get the maximum element
3219
+ * const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
3220
+ * console.log(temps.last()); // 30;
3221
+ * console.log(temps.first()); // 15;
3222
+ */
3223
+ last(): K | undefined {
3224
+ return this.#core.getRightMost();
3225
+ }
3226
+
3227
+ /**
3228
+ * Remove and return the smallest key.
3229
+
3230
+
3231
+
3232
+
3233
+
3234
+
3235
+
3236
+
3237
+
3238
+
3239
+
3240
+
3241
+
3242
+
3243
+
3244
+
3245
+
3246
+
3247
+
3248
+
3249
+
3250
+
3251
+
3252
+
3253
+
3254
+
3255
+
3256
+
3257
+
3258
+
3259
+
3260
+
3261
+
3262
+
3263
+
3264
+ * @example
3265
+ * // Remove and return minimum
3266
+ * const queue = new TreeSet<number>([5, 1, 8, 3]);
3267
+ *
3268
+ * console.log(queue.pollFirst()); // 1;
3269
+ * console.log(queue.pollFirst()); // 3;
3270
+ * console.log(queue.size); // 2;
3271
+ */
3272
+ pollFirst(): K | undefined {
3273
+ const k = this.first();
3274
+ if (k === undefined) return undefined;
3275
+ this.delete(k);
3276
+ return k;
3277
+ }
3278
+
3279
+ /**
3280
+ * Remove and return the largest key.
3281
+
3282
+
3283
+
3284
+
3285
+
3286
+
3287
+
3288
+
3289
+
3290
+
3291
+
3292
+
3293
+
3294
+
3295
+
3296
+
3297
+
3298
+
3299
+
3300
+
3301
+
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+
3308
+
3309
+
3310
+
3311
+
3312
+
3313
+
3314
+
3315
+
3316
+ * @example
3317
+ * // Remove and return maximum
3318
+ * const stack = new TreeSet<number>([10, 20, 30]);
3319
+ *
3320
+ * console.log(stack.pollLast()); // 30;
3321
+ * console.log(stack.size); // 2;
3322
+ */
3323
+ pollLast(): K | undefined {
3324
+ const k = this.last();
3325
+ if (k === undefined) return undefined;
3326
+ this.delete(k);
3327
+ return k;
3328
+ }
3329
+
3330
+ /**
3331
+ * Smallest key that is >= the given key.
3332
+
3333
+
3334
+
3335
+
3336
+
3337
+
3338
+
3339
+
3340
+
3341
+
3342
+
3343
+
3344
+
3345
+
3346
+
3347
+
3348
+
3349
+
3350
+
3351
+
3352
+
3353
+
3354
+
3355
+
3356
+
3357
+
3358
+
3359
+
3360
+
3361
+
3362
+
3363
+
3364
+
3365
+
3366
+
3367
+
3368
+
3369
+
3370
+
3371
+
3372
+
3373
+
3374
+
3375
+
3376
+
3377
+
3378
+
3379
+
3380
+
3381
+
3382
+
3383
+
3384
+
3385
+
3386
+
3387
+
3388
+
3389
+
3390
+
3391
+
3392
+
3393
+
3394
+
3395
+
3396
+
3397
+
3398
+
3399
+
3400
+
3401
+
3402
+
3403
+
3404
+
3405
+
3406
+
3407
+
3408
+
3409
+
3410
+
3411
+
3412
+
3413
+
3414
+
3415
+
3416
+
3417
+
3418
+
3419
+
3420
+
3421
+
3422
+
3423
+
3424
+
3425
+
3426
+
3427
+
3428
+
3429
+
3430
+
3431
+
3432
+
3433
+
3434
+
3435
+
3436
+
3437
+
3438
+
3439
+
3440
+
3441
+
3442
+
3443
+
3444
+
3445
+
3446
+
3447
+
3448
+
3449
+
3450
+
3451
+
3452
+
3453
+
3454
+
3455
+
3456
+
3457
+
3458
+
3459
+
3460
+
3461
+
3462
+
3463
+
3464
+
3465
+
3466
+ * @example
3467
+ * // Finding nearest available time slot
3468
+ * // Available appointment times (minutes from midnight)
3469
+ * const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
3470
+ *
3471
+ * // Customer wants something around 10:30 (630 min)
3472
+ * const nearest = slots.ceiling(630);
3473
+ * console.log(nearest); // 660; // 11:00 AM
3474
+ *
3475
+ * // What's the latest slot before 2:00 PM (840)?
3476
+ * const before2pm = slots.lower(840);
3477
+ * console.log(before2pm); // 720; // 12:00 PM
3478
+ *
3479
+ * // Book the 11:00 slot
3480
+ * slots.delete(660);
3481
+ * console.log(slots.ceiling(630)); // 720;
3482
+ */
3483
+ ceiling(key: K): K | undefined {
3484
+ this._validateKey(key);
3485
+ return this.#core.ceiling(key);
3486
+ }
3487
+
3488
+ /**
3489
+ * Largest key that is <= the given key.
3490
+
3491
+
3492
+
3493
+
3494
+
3495
+
3496
+
3497
+
3498
+
3499
+
3500
+
3501
+
3502
+
3503
+
3504
+
3505
+
3506
+
3507
+
3508
+
3509
+
3510
+
3511
+
3512
+
3513
+
3514
+
3515
+
3516
+
3517
+
3518
+
3519
+
3520
+
3521
+
3522
+
3523
+
3524
+
3525
+
3526
+
3527
+
3528
+
3529
+
3530
+
3531
+
3532
+
3533
+
3534
+
3535
+
3536
+
3537
+
3538
+
3539
+
3540
+
3541
+
3542
+
3543
+
3544
+
3545
+
3546
+
3547
+
3548
+
3549
+
3550
+
3551
+
3552
+
3553
+
3554
+
3555
+
3556
+
3557
+
3558
+
3559
+
3560
+
3561
+
3562
+
3563
+
3564
+
3565
+
3566
+
3567
+
3568
+
3569
+
3570
+
3571
+
3572
+
3573
+
3574
+
3575
+
3576
+
3577
+
3578
+
3579
+
3580
+
3581
+
3582
+
3583
+
3584
+
3585
+
3586
+
3587
+
3588
+
3589
+
3590
+
3591
+
3592
+
3593
+
3594
+
3595
+
3596
+
3597
+
3598
+
3599
+
3600
+
3601
+
3602
+
3603
+
3604
+
3605
+
3606
+
3607
+
3608
+
3609
+
3610
+
3611
+
3612
+
3613
+
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+
3624
+ * @example
3625
+ * // Largest element ≤ target
3626
+ * const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
3627
+ *
3628
+ * // Current width is 800 → which breakpoint applies?
3629
+ * console.log(breakpoints.floor(800)); // 768;
3630
+ * console.log(breakpoints.floor(1024)); // 1024; // exact match
3631
+ * console.log(breakpoints.floor(100)); // undefined;
3632
+ */
3633
+ floor(key: K): K | undefined {
3634
+ this._validateKey(key);
3635
+ return this.#core.floor(key);
3636
+ }
3637
+
3638
+ /**
3639
+ * Smallest key that is > the given key.
3640
+
3641
+
3642
+
3643
+
3644
+
3645
+
3646
+
3647
+
3648
+
3649
+
3650
+
3651
+
3652
+
3653
+
3654
+
3655
+
3656
+
3657
+
3658
+
3659
+
3660
+
3661
+
3662
+
3663
+
3664
+
3665
+
3666
+
3667
+
3668
+
3669
+
3670
+
3671
+
3672
+
3673
+
3674
+
3675
+
3676
+
3677
+
3678
+
3679
+
3680
+
3681
+
3682
+
3683
+
3684
+
3685
+
3686
+
3687
+
3688
+
3689
+
3690
+
3691
+
3692
+
3693
+
3694
+
3695
+
3696
+
3697
+
3698
+
3699
+
3700
+
3701
+
3702
+
3703
+
3704
+
3705
+
3706
+
3707
+
3708
+
3709
+
3710
+
3711
+
3712
+
3713
+
3714
+
3715
+
3716
+
3717
+
3718
+
3719
+
3720
+
3721
+
3722
+
3723
+
3724
+
3725
+
3726
+
3727
+
3728
+
3729
+
3730
+
3731
+
3732
+
3733
+
3734
+
3735
+
3736
+
3737
+
3738
+
3739
+
3740
+
3741
+
3742
+
3743
+
3744
+
3745
+
3746
+
3747
+
3748
+
3749
+
3750
+
3751
+
3752
+
3753
+
3754
+
3755
+
3756
+
3757
+
3758
+
3759
+
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+
3770
+
3771
+
3772
+
3773
+
3774
+ * @example
3775
+ * // Smallest element strictly > target
3776
+ * const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
1353
3777
  *
1354
3778
  * console.log(levels.higher(10)); // 25;
1355
3779
  * console.log(levels.higher(100)); // undefined;
@@ -1378,6 +3802,102 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1378
3802
 
1379
3803
 
1380
3804
 
3805
+
3806
+
3807
+
3808
+
3809
+
3810
+
3811
+
3812
+
3813
+
3814
+
3815
+
3816
+
3817
+
3818
+
3819
+
3820
+
3821
+
3822
+
3823
+
3824
+
3825
+
3826
+
3827
+
3828
+
3829
+
3830
+
3831
+
3832
+
3833
+
3834
+
3835
+
3836
+
3837
+
3838
+
3839
+
3840
+
3841
+
3842
+
3843
+
3844
+
3845
+
3846
+
3847
+
3848
+
3849
+
3850
+
3851
+
3852
+
3853
+
3854
+
3855
+
3856
+
3857
+
3858
+
3859
+
3860
+
3861
+
3862
+
3863
+
3864
+
3865
+
3866
+
3867
+
3868
+
3869
+
3870
+
3871
+
3872
+
3873
+
3874
+
3875
+
3876
+
3877
+
3878
+
3879
+
3880
+
3881
+
3882
+
3883
+
3884
+
3885
+
3886
+
3887
+
3888
+
3889
+
3890
+
3891
+
3892
+
3893
+
3894
+
3895
+
3896
+
3897
+
3898
+
3899
+
3900
+
1381
3901
 
1382
3902
 
1383
3903
 
@@ -1433,6 +3953,102 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1433
3953
 
1434
3954
 
1435
3955
 
3956
+
3957
+
3958
+
3959
+
3960
+
3961
+
3962
+
3963
+
3964
+
3965
+
3966
+
3967
+
3968
+
3969
+
3970
+
3971
+
3972
+
3973
+
3974
+
3975
+
3976
+
3977
+
3978
+
3979
+
3980
+
3981
+
3982
+
3983
+
3984
+
3985
+
3986
+
3987
+
3988
+
3989
+
3990
+
3991
+
3992
+
3993
+
3994
+
3995
+
3996
+
3997
+
3998
+
3999
+
4000
+
4001
+
4002
+
4003
+
4004
+
4005
+
4006
+
4007
+
4008
+
4009
+
4010
+
4011
+
4012
+
4013
+
4014
+
4015
+
4016
+
4017
+
4018
+
4019
+
4020
+
4021
+
4022
+
4023
+
4024
+
4025
+
4026
+
4027
+
4028
+
4029
+
4030
+
4031
+
4032
+
4033
+
4034
+
4035
+
4036
+
4037
+
4038
+
4039
+
4040
+
4041
+
4042
+
4043
+
4044
+
4045
+
4046
+
4047
+
4048
+
4049
+
4050
+
4051
+
1436
4052
 
1437
4053
 
1438
4054
 
@@ -1493,6 +4109,66 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1493
4109
  return out;
1494
4110
  }
1495
4111
 
4112
+ // ─── Order-Statistic Methods ───────────────────────────
4113
+
4114
+ /**
4115
+ * Returns the element at the k-th position in tree order (0-indexed).
4116
+ * @remarks Time O(log n). Requires `enableOrderStatistic: true`.
4117
+
4118
+
4119
+
4120
+ * @example
4121
+ * // Find k-th element in a TreeSet
4122
+ * const set = new TreeSet<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
4123
+ * console.log(set.getByRank(0)); // 10;
4124
+ * console.log(set.getByRank(2)); // 30;
4125
+ * console.log(set.getRank(30)); // 2;
4126
+ */
4127
+ getByRank(k: number): K | undefined {
4128
+ return this.#core.getByRank(k);
4129
+ }
4130
+
4131
+ /**
4132
+ * Returns the 0-based rank of a key (number of elements that precede it in tree order).
4133
+ * @remarks Time O(log n). Requires `enableOrderStatistic: true`.
4134
+ * @example
4135
+ * // Get the rank of a key in sorted order
4136
+ * const tree = new TreeSet<number>(
4137
+ * [10, 20, 30, 40, 50],
4138
+ * { enableOrderStatistic: true }
4139
+ * );
4140
+ * console.log(tree.getRank(10)); // 0; // smallest → rank 0
4141
+ * console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
4142
+ * console.log(tree.getRank(50)); // 4; // largest → rank 4
4143
+ * console.log(tree.getRank(25)); // 2;
4144
+ */
4145
+ getRank(key: K): number {
4146
+ return this.#core.getRank(key);
4147
+ }
4148
+
4149
+ /**
4150
+ * Returns elements by rank range (0-indexed, inclusive on both ends).
4151
+ * @remarks Time O(log n + k). Requires `enableOrderStatistic: true`.
4152
+
4153
+ * @example
4154
+ * // Pagination with rangeByRank
4155
+ * const tree = new TreeSet<number>(
4156
+ * [10, 20, 30, 40, 50, 60, 70, 80, 90],
4157
+ * { enableOrderStatistic: true }
4158
+ * );
4159
+ * const pageSize = 3;
4160
+ *
4161
+ * // Page 1
4162
+ * console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
4163
+ * // Page 2
4164
+ * console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
4165
+ * // Page 3
4166
+ * console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
4167
+ */
4168
+ rangeByRank(start: number, end: number): K[] {
4169
+ return this.#core.rangeByRank(start, end).filter((k): k is K => k !== undefined);
4170
+ }
4171
+
1496
4172
  /**
1497
4173
  * Creates a shallow clone of this set.
1498
4174
  * @remarks Time O(n log n), Space O(n)
@@ -1514,6 +4190,126 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1514
4190
 
1515
4191
 
1516
4192
 
4193
+
4194
+
4195
+
4196
+
4197
+
4198
+
4199
+
4200
+
4201
+
4202
+
4203
+
4204
+
4205
+
4206
+
4207
+
4208
+
4209
+
4210
+
4211
+
4212
+
4213
+
4214
+
4215
+
4216
+
4217
+
4218
+
4219
+
4220
+
4221
+
4222
+
4223
+
4224
+
4225
+
4226
+
4227
+
4228
+
4229
+
4230
+
4231
+
4232
+
4233
+
4234
+
4235
+
4236
+
4237
+
4238
+
4239
+
4240
+
4241
+
4242
+
4243
+
4244
+
4245
+
4246
+
4247
+
4248
+
4249
+
4250
+
4251
+
4252
+
4253
+
4254
+
4255
+
4256
+
4257
+
4258
+
4259
+
4260
+
4261
+
4262
+
4263
+
4264
+
4265
+
4266
+
4267
+
4268
+
4269
+
4270
+
4271
+
4272
+
4273
+
4274
+
4275
+
4276
+
4277
+
4278
+
4279
+
4280
+
4281
+
4282
+
4283
+
4284
+
4285
+
4286
+
4287
+
4288
+
4289
+
4290
+
4291
+
4292
+
4293
+
4294
+
4295
+
4296
+
4297
+
4298
+
4299
+
4300
+
4301
+
4302
+
4303
+
4304
+
4305
+
4306
+
4307
+
4308
+
4309
+
4310
+
4311
+
4312
+
1517
4313
 
1518
4314
 
1519
4315