binary-tree-typed 2.5.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/cjs/index.cjs +609 -0
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/cjs-legacy/index.cjs +609 -0
  4. package/dist/cjs-legacy/index.cjs.map +1 -1
  5. package/dist/esm/index.mjs +609 -0
  6. package/dist/esm/index.mjs.map +1 -1
  7. package/dist/esm-legacy/index.mjs +609 -0
  8. package/dist/esm-legacy/index.mjs.map +1 -1
  9. package/dist/types/data-structures/base/index.d.ts +1 -0
  10. package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
  11. package/dist/types/data-structures/base/linear-base.d.ts +3 -3
  12. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +252 -0
  13. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +294 -0
  14. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +527 -2
  15. package/dist/types/data-structures/binary-tree/bst.d.ts +505 -1
  16. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +399 -0
  17. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +126 -1
  18. package/dist/types/data-structures/binary-tree/tree-map.d.ts +2881 -382
  19. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2867 -347
  20. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2328 -312
  21. package/dist/types/data-structures/binary-tree/tree-set.d.ts +2671 -277
  22. package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
  23. package/dist/types/data-structures/graph/directed-graph.d.ts +210 -0
  24. package/dist/types/data-structures/graph/undirected-graph.d.ts +189 -0
  25. package/dist/types/data-structures/hash/hash-map.d.ts +241 -10
  26. package/dist/types/data-structures/heap/heap.d.ts +294 -0
  27. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +360 -3
  28. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +318 -3
  29. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +380 -2
  30. package/dist/types/data-structures/matrix/matrix.d.ts +168 -0
  31. package/dist/types/data-structures/queue/deque.d.ts +319 -4
  32. package/dist/types/data-structures/queue/queue.d.ts +252 -0
  33. package/dist/types/data-structures/stack/stack.d.ts +210 -0
  34. package/dist/types/data-structures/trie/trie.d.ts +256 -4
  35. package/dist/types/interfaces/graph.d.ts +1 -1
  36. package/dist/types/types/common.d.ts +2 -2
  37. package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
  38. package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
  39. package/dist/types/types/utils/validate-type.d.ts +4 -4
  40. package/dist/umd/binary-tree-typed.js +609 -0
  41. package/dist/umd/binary-tree-typed.js.map +1 -1
  42. package/dist/umd/binary-tree-typed.min.js +5 -5
  43. package/dist/umd/binary-tree-typed.min.js.map +1 -1
  44. package/package.json +2 -2
  45. package/src/data-structures/base/index.ts +1 -0
  46. package/src/data-structures/base/iterable-entry-base.ts +8 -8
  47. package/src/data-structures/base/linear-base.ts +3 -3
  48. package/src/data-structures/binary-tree/avl-tree.ts +252 -0
  49. package/src/data-structures/binary-tree/binary-indexed-tree.ts +295 -1
  50. package/src/data-structures/binary-tree/binary-tree.ts +527 -2
  51. package/src/data-structures/binary-tree/bst.ts +505 -1
  52. package/src/data-structures/binary-tree/red-black-tree.ts +399 -0
  53. package/src/data-structures/binary-tree/segment-tree.ts +127 -2
  54. package/src/data-structures/binary-tree/tree-map.ts +2958 -459
  55. package/src/data-structures/binary-tree/tree-multi-map.ts +3069 -549
  56. package/src/data-structures/binary-tree/tree-multi-set.ts +2476 -460
  57. package/src/data-structures/binary-tree/tree-set.ts +2816 -422
  58. package/src/data-structures/graph/abstract-graph.ts +4 -4
  59. package/src/data-structures/graph/directed-graph.ts +210 -0
  60. package/src/data-structures/graph/undirected-graph.ts +189 -0
  61. package/src/data-structures/hash/hash-map.ts +246 -15
  62. package/src/data-structures/heap/heap.ts +294 -0
  63. package/src/data-structures/linked-list/doubly-linked-list.ts +360 -3
  64. package/src/data-structures/linked-list/singly-linked-list.ts +318 -3
  65. package/src/data-structures/linked-list/skip-linked-list.ts +380 -2
  66. package/src/data-structures/matrix/matrix.ts +169 -1
  67. package/src/data-structures/queue/deque.ts +320 -5
  68. package/src/data-structures/queue/queue.ts +252 -0
  69. package/src/data-structures/stack/stack.ts +210 -0
  70. package/src/data-structures/trie/trie.ts +257 -5
  71. package/src/interfaces/graph.ts +1 -1
  72. package/src/types/common.ts +2 -2
  73. package/src/types/data-structures/heap/heap.ts +1 -0
  74. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
  75. package/src/types/utils/validate-type.ts +4 -4
@@ -175,17 +175,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
175
175
 
176
176
 
177
177
 
178
- * @example
179
- * // Check empty
180
- * console.log(new TreeMap().isEmpty()); // true;
181
- */
182
- isEmpty(): boolean {
183
- return this.size === 0;
184
- }
185
-
186
- /**
187
- * Set or overwrite a value for a key.
188
- * @remarks Expected time O(log n)
189
178
 
190
179
 
191
180
 
@@ -233,36 +222,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
233
222
 
234
223
 
235
224
 
236
- * @example
237
- * // Sorted dictionary for a contact book
238
- * const contacts = new TreeMap<string, string>([
239
- * ['Bob', '555-0102'],
240
- * ['Alice', '555-0101'],
241
- * ['Charlie', '555-0103']
242
- * ]);
243
- *
244
- * // Contacts are automatically sorted by name
245
- * console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
246
- * console.log(contacts.get('Bob')); // '555-0102';
247
- *
248
- * // Find the first contact alphabetically after 'B'
249
- * console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
250
- *
251
- * // Find contacts in range
252
- * console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
253
- * // ['Alice', '555-0101'],
254
- * // ['Bob', '555-0102']
255
- * // ];
256
- */
257
- set(key: K, value: V | undefined): this {
258
- this._validateKey(key);
259
- this.#core.set(key, value as V);
260
- return this;
261
- }
262
-
263
- /**
264
- * Get the value under a key.
265
- * @remarks Expected time O(log n)
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
266
234
 
267
235
 
268
236
 
@@ -313,24 +281,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
313
281
 
314
282
 
315
283
  * @example
316
- * // Configuration registry with typed lookups
317
- * const config = new TreeMap<string, number>([
318
- * ['maxRetries', 3],
319
- * ['timeout', 5000],
320
- * ['poolSize', 10]
321
- * ]);
322
- *
323
- * console.log(config.get('timeout')); // 5000;
324
- * console.log(config.get('missing')); // undefined;
325
- * console.log(config.size); // 3;
284
+ * // Check empty
285
+ * console.log(new TreeMap().isEmpty()); // true;
326
286
  */
327
- get(key: K): V | undefined {
328
- this._validateKey(key);
329
- return this.#core.get(key);
287
+ isEmpty(): boolean {
288
+ return this.size === 0;
330
289
  }
331
290
 
332
291
  /**
333
- * Test whether a key exists.
292
+ * Set or overwrite a value for a key.
334
293
  * @remarks Expected time O(log n)
335
294
 
336
295
 
@@ -381,26 +340,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
381
340
 
382
341
 
383
342
 
384
- * @example
385
- * // Feature flag checking
386
- * const flags = new TreeMap<string, boolean>([
387
- * ['darkMode', true],
388
- * ['betaFeature', false],
389
- * ['notifications', true]
390
- * ]);
391
- *
392
- * console.log(flags.has('darkMode')); // true;
393
- * console.log(flags.has('unknownFlag')); // false;
394
- */
395
- has(key: K): boolean {
396
- this._validateKey(key);
397
- return this.#core.has(key);
398
- }
399
-
400
- /**
401
- * Delete a key.
402
- * @returns `true` if the key existed; otherwise `false`.
403
- * @remarks Expected time O(log n)
404
343
 
405
344
 
406
345
 
@@ -450,27 +389,22 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
450
389
 
451
390
 
452
391
 
453
- * @example
454
- * // Session management with expiry
455
- * const sessions = new TreeMap<string, number>([
456
- * ['sess_abc', Date.now()],
457
- * ['sess_def', Date.now()],
458
- * ['sess_ghi', Date.now()]
459
- * ]);
460
- *
461
- * console.log(sessions.size); // 3;
462
- * sessions.delete('sess_def');
463
- * console.log(sessions.has('sess_def')); // false;
464
- * console.log(sessions.size); // 2;
465
- */
466
- delete(key: K): boolean {
467
- this._validateKey(key);
468
- const res = this.#core.delete(key);
469
- return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
470
- }
471
-
472
- /**
473
- * Remove all entries.
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
474
408
 
475
409
 
476
410
 
@@ -510,17 +444,37 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
510
444
 
511
445
 
512
446
  * @example
513
- * // Remove all
514
- * const tm = new TreeMap<number, string>([[1, 'a']]);
515
- * tm.clear();
516
- * console.log(tm.isEmpty()); // true;
447
+ * // Sorted dictionary for a contact book
448
+ * const contacts = new TreeMap<string, string>([
449
+ * ['Bob', '555-0102'],
450
+ * ['Alice', '555-0101'],
451
+ * ['Charlie', '555-0103']
452
+ * ]);
453
+ *
454
+ * // Contacts are automatically sorted by name
455
+ * console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
456
+ * console.log(contacts.get('Bob')); // '555-0102';
457
+ *
458
+ * // Find the first contact alphabetically after 'B'
459
+ * console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
460
+ *
461
+ * // Find contacts in range
462
+ * console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
463
+ * // ['Alice', '555-0101'],
464
+ * // ['Bob', '555-0102']
465
+ * // ];
517
466
  */
518
- clear(): void {
519
- this.#core.clear();
467
+ set(key: K, value: V | undefined): this {
468
+ this._validateKey(key);
469
+ this.#core.set(key, value as V);
470
+ return this;
520
471
  }
521
472
 
522
473
  /**
523
- * Iterate over keys in ascending order.
474
+ * Get the value under a key.
475
+ * @remarks Expected time O(log n)
476
+
477
+
524
478
 
525
479
 
526
480
 
@@ -559,25 +513,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
559
513
 
560
514
 
561
515
 
562
- * @example
563
- * // Get sorted keys
564
- * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
565
- * console.log([...tm.keys()]); // [1, 3];
566
- */
567
- keys(): IterableIterator<K> {
568
- return this.#core.keys();
569
- }
570
-
571
- private _entryFromKey(k: K): [K, V | undefined] {
572
- // Keys come from `keys()` which only yields existing keys.
573
- // We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
574
- return [k, this.#core.get(k)];
575
- }
576
-
577
- /**
578
- * Iterate over values in ascending key order.
579
- *
580
- * Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
581
516
 
582
517
 
583
518
 
@@ -616,19 +551,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
616
551
 
617
552
 
618
553
 
619
- * @example
620
- * // Get values in key order
621
- * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
622
- * console.log([...tm.values()]); // ['a', 'b'];
623
- */
624
- *values(): IterableIterator<V | undefined> {
625
- for (const k of this.keys()) yield this._entryFromKey(k)[1];
626
- }
627
-
628
- /**
629
- * Iterate over `[key, value]` entries in ascending key order.
630
- *
631
- * Note: values may be `undefined`.
632
554
 
633
555
 
634
556
 
@@ -667,23 +589,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
667
589
 
668
590
 
669
591
 
670
- * @example
671
- * // Iterate key-value pairs
672
- * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
673
- * console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
674
- */
675
- *entries(): IterableIterator<[K, V | undefined]> {
676
- for (const k of this.keys()) yield this._entryFromKey(k);
677
- }
678
-
679
- [Symbol.iterator](): IterableIterator<[K, V | undefined]> {
680
- return this.entries();
681
- }
682
-
683
- /**
684
- * Visit each entry in ascending key order.
685
- *
686
- * Note: callback value may be `undefined`.
687
592
 
688
593
 
689
594
 
@@ -723,21 +628,29 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
723
628
 
724
629
 
725
630
  * @example
726
- * // Execute for each entry
727
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
728
- * const pairs: string[] = [];
729
- * tm.forEach((v, k) => pairs.push(`${k}:${v}`));
730
- * console.log(pairs); // ['1:a', '2:b'];
631
+ * // Configuration registry with typed lookups
632
+ * const config = new TreeMap<string, number>([
633
+ * ['maxRetries', 3],
634
+ * ['timeout', 5000],
635
+ * ['poolSize', 10]
636
+ * ]);
637
+ *
638
+ * console.log(config.get('timeout')); // 5000;
639
+ * console.log(config.get('missing')); // undefined;
640
+ * console.log(config.size); // 3;
731
641
  */
732
- forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: any): void {
733
- for (const [k, v] of this) cb.call(thisArg, v, k, this);
642
+ get(key: K): V | undefined {
643
+ this._validateKey(key);
644
+ return this.#core.get(key);
734
645
  }
735
646
 
736
647
  /**
737
- * Create a new TreeMap by mapping each entry to a new `[key, value]` entry.
738
- *
739
- * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
740
- * @remarks Time O(n log n) expected, Space O(n)
648
+ * Test whether a key exists.
649
+ * @remarks Expected time O(log n)
650
+
651
+
652
+
653
+
741
654
 
742
655
 
743
656
 
@@ -776,31 +689,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
776
689
 
777
690
 
778
691
 
779
- * @example
780
- * // Transform entries
781
- * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
782
- * const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
783
- * console.log([...doubled.values()]); // [20, 40];
784
- */
785
- map<MK, MV>(
786
- callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
787
- options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
788
- thisArg?: unknown
789
- ): TreeMap<MK, MV> {
790
- const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
791
- let index = 0;
792
- for (const [k, v] of this) {
793
- const [mk, mv] = thisArg === undefined
794
- ? callbackfn(v, k, index++, this)
795
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
796
- out.set(mk, mv);
797
- }
798
- return out;
799
- }
800
-
801
- /**
802
- * Create a new TreeMap containing only entries that satisfy the predicate.
803
- * @remarks Time O(n log n) expected, Space O(n)
804
692
 
805
693
 
806
694
 
@@ -839,27 +727,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
839
727
 
840
728
 
841
729
 
842
- * @example
843
- * // Filter entries
844
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
845
- * const filtered = tm.filter((v, k) => k > 1);
846
- * console.log([...filtered.keys()]); // [2, 3];
847
- */
848
- filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
849
- const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
850
- let index = 0;
851
- for (const [k, v] of this) {
852
- const ok = thisArg === undefined
853
- ? callbackfn(v, k, index++, this)
854
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
855
- if (ok) out.set(k, v);
856
- }
857
- return out;
858
- }
859
-
860
- /**
861
- * Reduce entries into a single accumulator.
862
- * @remarks Time O(n), Space O(1)
863
730
 
864
731
 
865
732
 
@@ -898,21 +765,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
898
765
 
899
766
 
900
767
 
901
- * @example
902
- * // Aggregate values
903
- * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
904
- * console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
905
- */
906
- reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
907
- let acc = initialValue;
908
- let index = 0;
909
- for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
910
- return acc;
911
- }
912
-
913
- /**
914
- * Test whether all entries satisfy a predicate.
915
- * @remarks Time O(n), Space O(1)
916
768
 
917
769
 
918
770
 
@@ -950,24 +802,31 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
950
802
 
951
803
 
952
804
  * @example
953
- * // Test all entries
954
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
955
- * console.log(tm.every((v, k) => k > 0)); // true;
805
+ * // Feature flag checking
806
+ * const flags = new TreeMap<string, boolean>([
807
+ * ['darkMode', true],
808
+ * ['betaFeature', false],
809
+ * ['notifications', true]
810
+ * ]);
811
+ *
812
+ * console.log(flags.has('darkMode')); // true;
813
+ * console.log(flags.has('unknownFlag')); // false;
956
814
  */
957
- every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
958
- let index = 0;
959
- for (const [k, v] of this) {
960
- const ok = thisArg === undefined
961
- ? callbackfn(v, k, index++, this)
962
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
963
- if (!ok) return false;
964
- }
965
- return true;
815
+ has(key: K): boolean {
816
+ this._validateKey(key);
817
+ return this.#core.has(key);
966
818
  }
967
819
 
968
820
  /**
969
- * Test whether any entry satisfies a predicate.
970
- * @remarks Time O(n), Space O(1)
821
+ * Delete a key.
822
+ * @returns `true` if the key existed; otherwise `false`.
823
+ * @remarks Expected time O(log n)
824
+
825
+
826
+
827
+
828
+
829
+
971
830
 
972
831
 
973
832
 
@@ -1004,26 +863,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1004
863
 
1005
864
 
1006
865
 
1007
- * @example
1008
- * // Test any entry
1009
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1010
- * console.log(tm.some((v, k) => k === 2)); // true;
1011
- */
1012
- some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
1013
- let index = 0;
1014
- for (const [k, v] of this) {
1015
- const ok = thisArg === undefined
1016
- ? callbackfn(v, k, index++, this)
1017
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
1018
- if (ok) return true;
1019
- }
1020
- return false;
1021
- }
1022
-
1023
- /**
1024
- * Find the first entry that satisfies a predicate.
1025
- * @returns The first matching `[key, value]` tuple, or `undefined`.
1026
- * @remarks Time O(n), Space O(1)
1027
866
 
1028
867
 
1029
868
 
@@ -1060,25 +899,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1060
899
 
1061
900
 
1062
901
 
1063
- * @example
1064
- * // Find matching entry
1065
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1066
- * console.log(tm.find(v => v === 'b')?.[0]); // 2;
1067
- */
1068
- find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
1069
- let index = 0;
1070
- for (const [k, v] of this) {
1071
- const ok = thisArg === undefined
1072
- ? callbackfn(v, k, index++, this)
1073
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
1074
- if (ok) return [k, v];
1075
- }
1076
- return undefined;
1077
- }
1078
-
1079
- /**
1080
- * Materialize the map into an array of `[key, value]` tuples.
1081
- * @remarks Time O(n), Space O(n)
1082
902
 
1083
903
 
1084
904
 
@@ -1117,18 +937,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1117
937
 
1118
938
 
1119
939
 
1120
- * @example
1121
- * // Convert to array
1122
- * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
1123
- * console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
1124
- */
1125
- toArray(): Array<[K, V | undefined]> {
1126
- return [...this];
1127
- }
1128
-
1129
- /**
1130
- * Print a human-friendly representation.
1131
- * @remarks Time O(n), Space O(n)
1132
940
 
1133
941
 
1134
942
 
@@ -1168,20 +976,26 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1168
976
 
1169
977
 
1170
978
  * @example
1171
- * // Display tree
1172
- * const tm = new TreeMap<number, string>([[1, 'a']]);
1173
- * expect(() => tm.print()).not.toThrow();
979
+ * // Session management with expiry
980
+ * const sessions = new TreeMap<string, number>([
981
+ * ['sess_abc', Date.now()],
982
+ * ['sess_def', Date.now()],
983
+ * ['sess_ghi', Date.now()]
984
+ * ]);
985
+ *
986
+ * console.log(sessions.size); // 3;
987
+ * sessions.delete('sess_def');
988
+ * console.log(sessions.has('sess_def')); // false;
989
+ * console.log(sessions.size); // 2;
1174
990
  */
1175
- print(): void {
1176
- // Delegate to the underlying tree's visualization.
1177
- this.#core.print();
991
+ delete(key: K): boolean {
992
+ this._validateKey(key);
993
+ const res = this.#core.delete(key);
994
+ return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
1178
995
  }
1179
996
 
1180
- // Navigable operations (return entry tuples)
1181
- // Note: returned tuple values may be `undefined`.
1182
-
1183
997
  /**
1184
- * Smallest entry by key.
998
+ * Remove all entries.
1185
999
 
1186
1000
 
1187
1001
 
@@ -1193,40 +1007,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1193
1007
 
1194
1008
 
1195
1009
 
1196
- * @example
1197
- * // Leaderboard with ranked scores
1198
- * // Use score as key (descending), player name as value
1199
- * const leaderboard = new TreeMap<number, string>([], {
1200
- * comparator: (a, b) => b - a // descending
1201
- * });
1202
- *
1203
- * leaderboard.set(1500, 'Alice');
1204
- * leaderboard.set(2200, 'Bob');
1205
- * leaderboard.set(1800, 'Charlie');
1206
- * leaderboard.set(2500, 'Diana');
1207
- *
1208
- * // Top 3 players (first 3 in descending order)
1209
- * const top3 = [...leaderboard.entries()].slice(0, 3);
1210
- * console.log(top3); // [
1211
- * // [2500, 'Diana'],
1212
- * // [2200, 'Bob'],
1213
- * // [1800, 'Charlie']
1214
- * // ];
1215
- *
1216
- * // Highest scorer
1217
- * console.log(leaderboard.first()); // [2500, 'Diana'];
1218
- *
1219
- * // Remove lowest scorer
1220
- * console.log(leaderboard.pollLast()); // [1500, 'Alice'];
1221
- * console.log(leaderboard.size); // 3;
1222
- */
1223
- first(): [K, V | undefined] | undefined {
1224
- const k = this.#core.getLeftMost();
1225
- return k === undefined ? undefined : this._entryFromKey(k);
1226
- }
1227
-
1228
- /**
1229
- * Largest entry by key.
1230
1010
 
1231
1011
 
1232
1012
 
@@ -1238,24 +1018,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1238
1018
 
1239
1019
 
1240
1020
 
1241
- * @example
1242
- * // Access the maximum entry
1243
- * const scores = new TreeMap<number, string>([
1244
- * [85, 'Bob'],
1245
- * [92, 'Alice'],
1246
- * [78, 'Charlie']
1247
- * ]);
1248
- *
1249
- * console.log(scores.last()); // [92, 'Alice'];
1250
- * console.log(scores.first()); // [78, 'Charlie'];
1251
- */
1252
- last(): [K, V | undefined] | undefined {
1253
- const k = this.#core.getRightMost();
1254
- return k === undefined ? undefined : this._entryFromKey(k);
1255
- }
1256
-
1257
- /**
1258
- * Remove and return the smallest entry.
1259
1021
 
1260
1022
 
1261
1023
 
@@ -1267,28 +1029,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1267
1029
 
1268
1030
 
1269
1031
 
1270
- * @example
1271
- * // Process items from lowest priority
1272
- * const tasks = new TreeMap<number, string>([
1273
- * [3, 'Low'],
1274
- * [1, 'Critical'],
1275
- * [2, 'Medium']
1276
- * ]);
1277
- *
1278
- * // Process lowest priority first
1279
- * console.log(tasks.pollFirst()); // [1, 'Critical'];
1280
- * console.log(tasks.pollFirst()); // [2, 'Medium'];
1281
- * console.log(tasks.size); // 1;
1282
- */
1283
- pollFirst(): [K, V | undefined] | undefined {
1284
- const entry = this.first();
1285
- if (!entry) return undefined;
1286
- this.delete(entry[0]);
1287
- return entry;
1288
- }
1289
-
1290
- /**
1291
- * Remove and return the largest entry.
1292
1032
 
1293
1033
 
1294
1034
 
@@ -1300,28 +1040,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1300
1040
 
1301
1041
 
1302
1042
 
1303
- * @example
1304
- * // Remove the maximum entry
1305
- * const bids = new TreeMap<number, string>([
1306
- * [100, 'Alice'],
1307
- * [150, 'Bob'],
1308
- * [120, 'Charlie']
1309
- * ]);
1310
- *
1311
- * // Remove highest bid
1312
- * console.log(bids.pollLast()); // [150, 'Bob'];
1313
- * console.log(bids.size); // 2;
1314
- * console.log(bids.last()); // [120, 'Charlie'];
1315
- */
1316
- pollLast(): [K, V | undefined] | undefined {
1317
- const entry = this.last();
1318
- if (!entry) return undefined;
1319
- this.delete(entry[0]);
1320
- return entry;
1321
- }
1322
-
1323
- /**
1324
- * Smallest entry whose key is >= the given key.
1325
1043
 
1326
1044
 
1327
1045
 
@@ -1360,11 +1078,2351 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1360
1078
 
1361
1079
 
1362
1080
 
1363
- * @example
1364
- * // Event scheduler with time-based lookup
1365
- * const events = new TreeMap<Date, string>();
1366
- *
1367
- * const meeting = new Date('2024-01-15T10:00:00Z');
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
+ * @example
1143
+ * // Remove all
1144
+ * const tm = new TreeMap<number, string>([[1, 'a']]);
1145
+ * tm.clear();
1146
+ * console.log(tm.isEmpty()); // true;
1147
+ */
1148
+ clear(): void {
1149
+ this.#core.clear();
1150
+ }
1151
+
1152
+ /**
1153
+ * Iterate over keys in ascending order.
1154
+
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+
1177
+
1178
+
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
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
+ * @example
1298
+ * // Get sorted keys
1299
+ * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
1300
+ * console.log([...tm.keys()]); // [1, 3];
1301
+ */
1302
+ keys(): IterableIterator<K> {
1303
+ return this.#core.keys();
1304
+ }
1305
+
1306
+ private _entryFromKey(k: K): [K, V | undefined] {
1307
+ // Keys come from `keys()` which only yields existing keys.
1308
+ // We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
1309
+ return [k, this.#core.get(k)];
1310
+ }
1311
+
1312
+ /**
1313
+ * Iterate over values in ascending key order.
1314
+ *
1315
+ * Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
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
+
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
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
+ * @example
1460
+ * // Get values in key order
1461
+ * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
1462
+ * console.log([...tm.values()]); // ['a', 'b'];
1463
+ */
1464
+ *values(): IterableIterator<V | undefined> {
1465
+ for (const k of this.keys()) yield this._entryFromKey(k)[1];
1466
+ }
1467
+
1468
+ /**
1469
+ * Iterate over `[key, value]` entries in ascending key order.
1470
+ *
1471
+ * Note: values may be `undefined`.
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
+
1519
+
1520
+
1521
+
1522
+
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+
1529
+
1530
+
1531
+
1532
+
1533
+
1534
+
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
+ * @example
1616
+ * // Iterate key-value pairs
1617
+ * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
1618
+ * console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
1619
+ */
1620
+ *entries(): IterableIterator<[K, V | undefined]> {
1621
+ for (const k of this.keys()) yield this._entryFromKey(k);
1622
+ }
1623
+
1624
+ [Symbol.iterator](): IterableIterator<[K, V | undefined]> {
1625
+ return this.entries();
1626
+ }
1627
+
1628
+ /**
1629
+ * Visit each entry in ascending key order.
1630
+ *
1631
+ * Note: callback value may be `undefined`.
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
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+
1701
+
1702
+
1703
+
1704
+
1705
+
1706
+
1707
+
1708
+
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
+ * @example
1776
+ * // Execute for each entry
1777
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1778
+ * const pairs: string[] = [];
1779
+ * tm.forEach((v, k) => pairs.push(`${k}:${v}`));
1780
+ * console.log(pairs); // ['1:a', '2:b'];
1781
+ */
1782
+ forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: unknown): void {
1783
+ for (const [k, v] of this) cb.call(thisArg, v, k, this);
1784
+ }
1785
+
1786
+ /**
1787
+ * Create a new TreeMap by mapping each entry to a new `[key, value]` entry.
1788
+ *
1789
+ * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
1790
+ * @remarks Time O(n log n) expected, Space O(n)
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
+
1868
+
1869
+
1870
+
1871
+
1872
+
1873
+
1874
+
1875
+
1876
+
1877
+
1878
+
1879
+
1880
+
1881
+
1882
+
1883
+
1884
+
1885
+
1886
+
1887
+
1888
+
1889
+
1890
+
1891
+
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
+ * @example
1935
+ * // Transform entries
1936
+ * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
1937
+ * const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
1938
+ * console.log([...doubled.values()]); // [20, 40];
1939
+ */
1940
+ map<MK, MV>(
1941
+ callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
1942
+ options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
1943
+ thisArg?: unknown
1944
+ ): TreeMap<MK, MV> {
1945
+ const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
1946
+ let index = 0;
1947
+ for (const [k, v] of this) {
1948
+ const [mk, mv] = thisArg === undefined
1949
+ ? callbackfn(v, k, index++, this)
1950
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
1951
+ out.set(mk, mv);
1952
+ }
1953
+ return out;
1954
+ }
1955
+
1956
+ /**
1957
+ * Create a new TreeMap containing only entries that satisfy the predicate.
1958
+ * @remarks Time O(n log n) expected, Space O(n)
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
+
2051
+
2052
+
2053
+
2054
+
2055
+
2056
+
2057
+
2058
+
2059
+
2060
+
2061
+
2062
+
2063
+
2064
+
2065
+
2066
+
2067
+
2068
+
2069
+
2070
+
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
+ * @example
2103
+ * // Filter entries
2104
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
2105
+ * const filtered = tm.filter((v, k) => k > 1);
2106
+ * console.log([...filtered.keys()]); // [2, 3];
2107
+ */
2108
+ filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
2109
+ const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
2110
+ let index = 0;
2111
+ for (const [k, v] of this) {
2112
+ const ok = thisArg === undefined
2113
+ ? callbackfn(v, k, index++, this)
2114
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2115
+ if (ok) out.set(k, v);
2116
+ }
2117
+ return out;
2118
+ }
2119
+
2120
+ /**
2121
+ * Reduce entries into a single accumulator.
2122
+ * @remarks Time O(n), Space O(1)
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
+
2230
+
2231
+
2232
+
2233
+
2234
+
2235
+
2236
+
2237
+
2238
+
2239
+
2240
+
2241
+
2242
+
2243
+
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+
2259
+
2260
+
2261
+
2262
+
2263
+
2264
+
2265
+
2266
+ * @example
2267
+ * // Aggregate values
2268
+ * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
2269
+ * console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
2270
+ */
2271
+ reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
2272
+ let acc = initialValue;
2273
+ let index = 0;
2274
+ for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
2275
+ return acc;
2276
+ }
2277
+
2278
+ /**
2279
+ * Test whether all entries satisfy a predicate.
2280
+ * @remarks Time O(n), Space O(1)
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
+
2402
+
2403
+
2404
+
2405
+
2406
+
2407
+
2408
+
2409
+
2410
+
2411
+
2412
+
2413
+
2414
+
2415
+
2416
+
2417
+
2418
+
2419
+
2420
+
2421
+
2422
+ * @example
2423
+ * // Test all entries
2424
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
2425
+ * console.log(tm.every((v, k) => k > 0)); // true;
2426
+ */
2427
+ every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
2428
+ let index = 0;
2429
+ for (const [k, v] of this) {
2430
+ const ok = thisArg === undefined
2431
+ ? callbackfn(v, k, index++, this)
2432
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2433
+ if (!ok) return false;
2434
+ }
2435
+ return true;
2436
+ }
2437
+
2438
+ /**
2439
+ * Test whether any entry satisfies a predicate.
2440
+ * @remarks Time O(n), Space O(1)
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
+
2577
+
2578
+
2579
+
2580
+
2581
+
2582
+ * @example
2583
+ * // Test any entry
2584
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
2585
+ * console.log(tm.some((v, k) => k === 2)); // true;
2586
+ */
2587
+ some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
2588
+ let index = 0;
2589
+ for (const [k, v] of this) {
2590
+ const ok = thisArg === undefined
2591
+ ? callbackfn(v, k, index++, this)
2592
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2593
+ if (ok) return true;
2594
+ }
2595
+ return false;
2596
+ }
2597
+
2598
+ /**
2599
+ * Find the first entry that satisfies a predicate.
2600
+ * @returns The first matching `[key, value]` tuple, or `undefined`.
2601
+ * @remarks Time O(n), Space O(1)
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
+ * @example
2744
+ * // Find matching entry
2745
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
2746
+ * console.log(tm.find(v => v === 'b')?.[0]); // 2;
2747
+ */
2748
+ find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
2749
+ let index = 0;
2750
+ for (const [k, v] of this) {
2751
+ const ok = thisArg === undefined
2752
+ ? callbackfn(v, k, index++, this)
2753
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2754
+ if (ok) return [k, v];
2755
+ }
2756
+ return undefined;
2757
+ }
2758
+
2759
+ /**
2760
+ * Materialize the map into an array of `[key, value]` tuples.
2761
+ * @remarks Time O(n), Space O(n)
2762
+
2763
+
2764
+
2765
+
2766
+
2767
+
2768
+
2769
+
2770
+
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
+ * @example
2906
+ * // Convert to array
2907
+ * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
2908
+ * console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
2909
+ */
2910
+ toArray(): Array<[K, V | undefined]> {
2911
+ return [...this];
2912
+ }
2913
+
2914
+ /**
2915
+ * Print a human-friendly representation.
2916
+ * @remarks Time O(n), Space O(n)
2917
+
2918
+
2919
+
2920
+
2921
+
2922
+
2923
+
2924
+
2925
+
2926
+
2927
+
2928
+
2929
+
2930
+
2931
+
2932
+
2933
+
2934
+
2935
+
2936
+
2937
+
2938
+
2939
+
2940
+
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
+ * @example
3061
+ * // Display tree
3062
+ * const tm = new TreeMap<number, string>([[1, 'a']]);
3063
+ * expect(() => tm.print()).not.toThrow();
3064
+ */
3065
+ print(): void {
3066
+ // Delegate to the underlying tree's visualization.
3067
+ this.#core.print();
3068
+ }
3069
+
3070
+ // Navigable operations (return entry tuples)
3071
+ // Note: returned tuple values may be `undefined`.
3072
+
3073
+ /**
3074
+ * Smallest entry by key.
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
+
3100
+
3101
+
3102
+
3103
+
3104
+
3105
+
3106
+
3107
+ * @example
3108
+ * // Leaderboard with ranked scores
3109
+ * // Use score as key (descending), player name as value
3110
+ * const leaderboard = new TreeMap<number, string>([], {
3111
+ * comparator: (a, b) => b - a // descending
3112
+ * });
3113
+ *
3114
+ * leaderboard.set(1500, 'Alice');
3115
+ * leaderboard.set(2200, 'Bob');
3116
+ * leaderboard.set(1800, 'Charlie');
3117
+ * leaderboard.set(2500, 'Diana');
3118
+ *
3119
+ * // Top 3 players (first 3 in descending order)
3120
+ * const top3 = [...leaderboard.entries()].slice(0, 3);
3121
+ * console.log(top3); // [
3122
+ * // [2500, 'Diana'],
3123
+ * // [2200, 'Bob'],
3124
+ * // [1800, 'Charlie']
3125
+ * // ];
3126
+ *
3127
+ * // Highest scorer
3128
+ * console.log(leaderboard.first()); // [2500, 'Diana'];
3129
+ *
3130
+ * // Remove lowest scorer
3131
+ * console.log(leaderboard.pollLast()); // [1500, 'Alice'];
3132
+ * console.log(leaderboard.size); // 3;
3133
+ */
3134
+ first(): [K, V | undefined] | undefined {
3135
+ const k = this.#core.getLeftMost();
3136
+ return k === undefined ? undefined : this._entryFromKey(k);
3137
+ }
3138
+
3139
+ /**
3140
+ * Largest entry by key.
3141
+
3142
+
3143
+
3144
+
3145
+
3146
+
3147
+
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+
3154
+
3155
+
3156
+
3157
+
3158
+
3159
+
3160
+
3161
+
3162
+
3163
+
3164
+
3165
+
3166
+
3167
+
3168
+
3169
+
3170
+
3171
+
3172
+
3173
+ * @example
3174
+ * // Access the maximum entry
3175
+ * const scores = new TreeMap<number, string>([
3176
+ * [85, 'Bob'],
3177
+ * [92, 'Alice'],
3178
+ * [78, 'Charlie']
3179
+ * ]);
3180
+ *
3181
+ * console.log(scores.last()); // [92, 'Alice'];
3182
+ * console.log(scores.first()); // [78, 'Charlie'];
3183
+ */
3184
+ last(): [K, V | undefined] | undefined {
3185
+ const k = this.#core.getRightMost();
3186
+ return k === undefined ? undefined : this._entryFromKey(k);
3187
+ }
3188
+
3189
+ /**
3190
+ * Remove and return the smallest entry.
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
+
3218
+
3219
+
3220
+
3221
+
3222
+
3223
+ * @example
3224
+ * // Process items from lowest priority
3225
+ * const tasks = new TreeMap<number, string>([
3226
+ * [3, 'Low'],
3227
+ * [1, 'Critical'],
3228
+ * [2, 'Medium']
3229
+ * ]);
3230
+ *
3231
+ * // Process lowest priority first
3232
+ * console.log(tasks.pollFirst()); // [1, 'Critical'];
3233
+ * console.log(tasks.pollFirst()); // [2, 'Medium'];
3234
+ * console.log(tasks.size); // 1;
3235
+ */
3236
+ pollFirst(): [K, V | undefined] | undefined {
3237
+ const entry = this.first();
3238
+ if (!entry) return undefined;
3239
+ this.delete(entry[0]);
3240
+ return entry;
3241
+ }
3242
+
3243
+ /**
3244
+ * Remove and return the largest entry.
3245
+
3246
+
3247
+
3248
+
3249
+
3250
+
3251
+
3252
+
3253
+
3254
+
3255
+
3256
+
3257
+
3258
+
3259
+
3260
+
3261
+
3262
+
3263
+
3264
+
3265
+
3266
+
3267
+
3268
+
3269
+
3270
+
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+ * @example
3278
+ * // Remove the maximum entry
3279
+ * const bids = new TreeMap<number, string>([
3280
+ * [100, 'Alice'],
3281
+ * [150, 'Bob'],
3282
+ * [120, 'Charlie']
3283
+ * ]);
3284
+ *
3285
+ * // Remove highest bid
3286
+ * console.log(bids.pollLast()); // [150, 'Bob'];
3287
+ * console.log(bids.size); // 2;
3288
+ * console.log(bids.last()); // [120, 'Charlie'];
3289
+ */
3290
+ pollLast(): [K, V | undefined] | undefined {
3291
+ const entry = this.last();
3292
+ if (!entry) return undefined;
3293
+ this.delete(entry[0]);
3294
+ return entry;
3295
+ }
3296
+
3297
+ /**
3298
+ * Smallest entry whose key is >= the given key.
3299
+
3300
+
3301
+
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+
3308
+
3309
+
3310
+
3311
+
3312
+
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+
3321
+
3322
+
3323
+
3324
+
3325
+
3326
+
3327
+
3328
+
3329
+
3330
+
3331
+
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
+ * @example
3422
+ * // Event scheduler with time-based lookup
3423
+ * const events = new TreeMap<Date, string>();
3424
+ *
3425
+ * const meeting = new Date('2024-01-15T10:00:00Z');
1368
3426
  * const lunch = new Date('2024-01-15T12:00:00Z');
1369
3427
  * const review = new Date('2024-01-15T15:00:00Z');
1370
3428
  * const standup = new Date('2024-01-15T09:00:00Z');
@@ -1382,24 +3440,324 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1382
3440
  * // 'Code Review'
1383
3441
  * // ];
1384
3442
  *
1385
- * // Next event after 11:00
1386
- * const after11 = new Date('2024-01-15T11:00:00Z');
1387
- * console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
3443
+ * // Next event after 11:00
3444
+ * const after11 = new Date('2024-01-15T11:00:00Z');
3445
+ * console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
3446
+ *
3447
+ * // Events between 9:30 and 13:00
3448
+ * const from = new Date('2024-01-15T09:30:00Z');
3449
+ * const to = new Date('2024-01-15T13:00:00Z');
3450
+ * const window = events.rangeSearch([from, to]);
3451
+ * console.log(window.map(([, v]) => v)); // ['Team Meeting', 'Lunch Break'];
3452
+ */
3453
+ ceiling(key: K): [K, V | undefined] | undefined {
3454
+ this._validateKey(key);
3455
+ const k = this.#core.ceiling(key);
3456
+ return k === undefined ? undefined : this._entryFromKey(k);
3457
+ }
3458
+
3459
+ /**
3460
+ * Largest entry whose key is <= the given key.
3461
+
3462
+
3463
+
3464
+
3465
+
3466
+
3467
+
3468
+
3469
+
3470
+
3471
+
3472
+
3473
+
3474
+
3475
+
3476
+
3477
+
3478
+
3479
+
3480
+
3481
+
3482
+
3483
+
3484
+
3485
+
3486
+
3487
+
3488
+
3489
+
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
+ * @example
3584
+ * // Find the largest key ≤ target
3585
+ * const versions = new TreeMap<number, string>([
3586
+ * [1, 'v1.0'],
3587
+ * [3, 'v3.0'],
3588
+ * [5, 'v5.0'],
3589
+ * [7, 'v7.0']
3590
+ * ]);
3591
+ *
3592
+ * // Largest version ≤ 4
3593
+ * console.log(versions.floor(4)); // [3, 'v3.0'];
3594
+ * // Largest version ≤ 5 (exact match)
3595
+ * console.log(versions.floor(5)); // [5, 'v5.0'];
3596
+ * // No version ≤ 0
3597
+ * console.log(versions.floor(0)); // undefined;
3598
+ */
3599
+ floor(key: K): [K, V | undefined] | undefined {
3600
+ this._validateKey(key);
3601
+ const k = this.#core.floor(key);
3602
+ return k === undefined ? undefined : this._entryFromKey(k);
3603
+ }
3604
+
3605
+ /**
3606
+ * Smallest entry whose key is > the given key.
3607
+
3608
+
3609
+
3610
+
3611
+
3612
+
3613
+
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+
3624
+
3625
+
3626
+
3627
+
3628
+
3629
+
3630
+
3631
+
3632
+
3633
+
3634
+
3635
+
3636
+
3637
+
3638
+
3639
+
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
+ * @example
3730
+ * // Find the smallest key strictly > target
3731
+ * const prices = new TreeMap<number, string>([
3732
+ * [10, 'Basic'],
3733
+ * [25, 'Standard'],
3734
+ * [50, 'Premium'],
3735
+ * [100, 'Enterprise']
3736
+ * ]);
1388
3737
  *
1389
- * // Events between 9:30 and 13:00
1390
- * const from = new Date('2024-01-15T09:30:00Z');
1391
- * const to = new Date('2024-01-15T13:00:00Z');
1392
- * const window = events.rangeSearch([from, to]);
1393
- * console.log(window.map(([, v]) => v)); // ['Team Meeting', 'Lunch Break'];
3738
+ * // Next tier above $25
3739
+ * console.log(prices.higher(25)); // [50, 'Premium'];
3740
+ * // Next tier above $99
3741
+ * console.log(prices.higher(99)); // [100, 'Enterprise'];
3742
+ * // Nothing above $100
3743
+ * console.log(prices.higher(100)); // undefined;
1394
3744
  */
1395
- ceiling(key: K): [K, V | undefined] | undefined {
3745
+ higher(key: K): [K, V | undefined] | undefined {
1396
3746
  this._validateKey(key);
1397
- const k = this.#core.ceiling(key);
3747
+ const k = this.#core.higher(key);
1398
3748
  return k === undefined ? undefined : this._entryFromKey(k);
1399
3749
  }
1400
3750
 
1401
3751
  /**
1402
- * Largest entry whose key is <= the given key.
3752
+ * Largest entry whose key is < the given key.
3753
+
3754
+
3755
+
3756
+
3757
+
3758
+
3759
+
3760
+
1403
3761
 
1404
3762
 
1405
3763
 
@@ -1438,30 +3796,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1438
3796
 
1439
3797
 
1440
3798
 
1441
- * @example
1442
- * // Find the largest key ≤ target
1443
- * const versions = new TreeMap<number, string>([
1444
- * [1, 'v1.0'],
1445
- * [3, 'v3.0'],
1446
- * [5, 'v5.0'],
1447
- * [7, 'v7.0']
1448
- * ]);
1449
- *
1450
- * // Largest version ≤ 4
1451
- * console.log(versions.floor(4)); // [3, 'v3.0'];
1452
- * // Largest version ≤ 5 (exact match)
1453
- * console.log(versions.floor(5)); // [5, 'v5.0'];
1454
- * // No version ≤ 0
1455
- * console.log(versions.floor(0)); // undefined;
1456
- */
1457
- floor(key: K): [K, V | undefined] | undefined {
1458
- this._validateKey(key);
1459
- const k = this.#core.floor(key);
1460
- return k === undefined ? undefined : this._entryFromKey(k);
1461
- }
1462
-
1463
- /**
1464
- * Smallest entry whose key is > the given key.
1465
3799
 
1466
3800
 
1467
3801
 
@@ -1500,30 +3834,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1500
3834
 
1501
3835
 
1502
3836
 
1503
- * @example
1504
- * // Find the smallest key strictly > target
1505
- * const prices = new TreeMap<number, string>([
1506
- * [10, 'Basic'],
1507
- * [25, 'Standard'],
1508
- * [50, 'Premium'],
1509
- * [100, 'Enterprise']
1510
- * ]);
1511
- *
1512
- * // Next tier above $25
1513
- * console.log(prices.higher(25)); // [50, 'Premium'];
1514
- * // Next tier above $99
1515
- * console.log(prices.higher(99)); // [100, 'Enterprise'];
1516
- * // Nothing above $100
1517
- * console.log(prices.higher(100)); // undefined;
1518
- */
1519
- higher(key: K): [K, V | undefined] | undefined {
1520
- this._validateKey(key);
1521
- const k = this.#core.higher(key);
1522
- return k === undefined ? undefined : this._entryFromKey(k);
1523
- }
1524
-
1525
- /**
1526
- * Largest entry whose key is < the given key.
1527
3837
 
1528
3838
 
1529
3839
 
@@ -1604,6 +3914,90 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1604
3914
 
1605
3915
 
1606
3916
 
3917
+
3918
+
3919
+
3920
+
3921
+
3922
+
3923
+
3924
+
3925
+
3926
+
3927
+
3928
+
3929
+
3930
+
3931
+
3932
+
3933
+
3934
+
3935
+
3936
+
3937
+
3938
+
3939
+
3940
+
3941
+
3942
+
3943
+
3944
+
3945
+
3946
+
3947
+
3948
+
3949
+
3950
+
3951
+
3952
+
3953
+
3954
+
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
+
1607
4001
 
1608
4002
 
1609
4003
 
@@ -1697,6 +4091,111 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1697
4091
 
1698
4092
 
1699
4093
 
4094
+
4095
+
4096
+
4097
+
4098
+
4099
+
4100
+
4101
+
4102
+
4103
+
4104
+
4105
+
4106
+
4107
+
4108
+
4109
+
4110
+
4111
+
4112
+
4113
+
4114
+
4115
+
4116
+
4117
+
4118
+
4119
+
4120
+
4121
+
4122
+
4123
+
4124
+
4125
+
4126
+
4127
+
4128
+
4129
+
4130
+
4131
+
4132
+
4133
+
4134
+
4135
+
4136
+
4137
+
4138
+
4139
+
4140
+
4141
+
4142
+
4143
+
4144
+
4145
+
4146
+
4147
+
4148
+
4149
+
4150
+
4151
+
4152
+
4153
+
4154
+
4155
+
4156
+
4157
+
4158
+
4159
+
4160
+
4161
+
4162
+
4163
+
4164
+
4165
+
4166
+
4167
+
4168
+
4169
+
4170
+
4171
+
4172
+
4173
+
4174
+
4175
+
4176
+
4177
+
4178
+
4179
+
4180
+
4181
+
4182
+
4183
+
4184
+
4185
+
4186
+
4187
+
4188
+
4189
+
4190
+
4191
+
4192
+
4193
+
4194
+
4195
+
4196
+
4197
+
4198
+
1700
4199
 
1701
4200
 
1702
4201