binary-tree-typed 2.4.5 → 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 (94) hide show
  1. package/README.md +0 -84
  2. package/dist/cjs/index.cjs +1476 -404
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs-legacy/index.cjs +1473 -401
  5. package/dist/cjs-legacy/index.cjs.map +1 -1
  6. package/dist/esm/index.mjs +1476 -404
  7. package/dist/esm/index.mjs.map +1 -1
  8. package/dist/esm-legacy/index.mjs +1473 -401
  9. package/dist/esm-legacy/index.mjs.map +1 -1
  10. package/dist/types/data-structures/base/index.d.ts +1 -0
  11. package/dist/types/data-structures/base/iterable-element-base.d.ts +1 -1
  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 +380 -51
  15. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +487 -147
  16. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +956 -80
  17. package/dist/types/data-structures/binary-tree/bst.d.ts +816 -29
  18. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +610 -31
  19. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +326 -135
  20. package/dist/types/data-structures/binary-tree/tree-map.d.ts +3781 -6
  21. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3607 -201
  22. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2874 -65
  23. package/dist/types/data-structures/binary-tree/tree-set.d.ts +3528 -6
  24. package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
  25. package/dist/types/data-structures/graph/directed-graph.d.ts +429 -47
  26. package/dist/types/data-structures/graph/map-graph.d.ts +59 -1
  27. package/dist/types/data-structures/graph/undirected-graph.d.ts +393 -59
  28. package/dist/types/data-structures/hash/hash-map.d.ts +473 -89
  29. package/dist/types/data-structures/heap/heap.d.ts +581 -99
  30. package/dist/types/data-structures/heap/max-heap.d.ts +46 -0
  31. package/dist/types/data-structures/heap/min-heap.d.ts +59 -0
  32. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +646 -47
  33. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +596 -68
  34. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +793 -12
  35. package/dist/types/data-structures/matrix/matrix.d.ts +499 -0
  36. package/dist/types/data-structures/priority-queue/max-priority-queue.d.ts +57 -0
  37. package/dist/types/data-structures/priority-queue/min-priority-queue.d.ts +60 -0
  38. package/dist/types/data-structures/priority-queue/priority-queue.d.ts +60 -0
  39. package/dist/types/data-structures/queue/deque.d.ts +593 -71
  40. package/dist/types/data-structures/queue/queue.d.ts +463 -42
  41. package/dist/types/data-structures/stack/stack.d.ts +384 -32
  42. package/dist/types/data-structures/trie/trie.d.ts +470 -48
  43. package/dist/types/interfaces/graph.d.ts +1 -1
  44. package/dist/types/types/common.d.ts +2 -2
  45. package/dist/types/types/data-structures/binary-tree/segment-tree.d.ts +1 -1
  46. package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
  47. package/dist/types/types/data-structures/linked-list/skip-linked-list.d.ts +1 -4
  48. package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
  49. package/dist/types/types/utils/validate-type.d.ts +4 -4
  50. package/dist/umd/binary-tree-typed.js +1469 -397
  51. package/dist/umd/binary-tree-typed.js.map +1 -1
  52. package/dist/umd/binary-tree-typed.min.js +5 -5
  53. package/dist/umd/binary-tree-typed.min.js.map +1 -1
  54. package/package.json +2 -2
  55. package/src/data-structures/base/index.ts +1 -0
  56. package/src/data-structures/base/iterable-element-base.ts +4 -5
  57. package/src/data-structures/base/iterable-entry-base.ts +8 -8
  58. package/src/data-structures/base/linear-base.ts +3 -3
  59. package/src/data-structures/binary-tree/avl-tree.ts +386 -51
  60. package/src/data-structures/binary-tree/binary-indexed-tree.ts +596 -247
  61. package/src/data-structures/binary-tree/binary-tree.ts +956 -81
  62. package/src/data-structures/binary-tree/bst.ts +840 -35
  63. package/src/data-structures/binary-tree/red-black-tree.ts +689 -97
  64. package/src/data-structures/binary-tree/segment-tree.ts +498 -249
  65. package/src/data-structures/binary-tree/tree-map.ts +3784 -7
  66. package/src/data-structures/binary-tree/tree-multi-map.ts +3614 -211
  67. package/src/data-structures/binary-tree/tree-multi-set.ts +2874 -65
  68. package/src/data-structures/binary-tree/tree-set.ts +3531 -10
  69. package/src/data-structures/graph/abstract-graph.ts +4 -4
  70. package/src/data-structures/graph/directed-graph.ts +429 -47
  71. package/src/data-structures/graph/map-graph.ts +59 -1
  72. package/src/data-structures/graph/undirected-graph.ts +393 -59
  73. package/src/data-structures/hash/hash-map.ts +476 -92
  74. package/src/data-structures/heap/heap.ts +581 -99
  75. package/src/data-structures/heap/max-heap.ts +46 -0
  76. package/src/data-structures/heap/min-heap.ts +59 -0
  77. package/src/data-structures/linked-list/doubly-linked-list.ts +646 -47
  78. package/src/data-structures/linked-list/singly-linked-list.ts +596 -68
  79. package/src/data-structures/linked-list/skip-linked-list.ts +1067 -90
  80. package/src/data-structures/matrix/matrix.ts +584 -12
  81. package/src/data-structures/priority-queue/max-priority-queue.ts +57 -0
  82. package/src/data-structures/priority-queue/min-priority-queue.ts +60 -0
  83. package/src/data-structures/priority-queue/priority-queue.ts +60 -0
  84. package/src/data-structures/queue/deque.ts +592 -70
  85. package/src/data-structures/queue/queue.ts +463 -42
  86. package/src/data-structures/stack/stack.ts +384 -32
  87. package/src/data-structures/trie/trie.ts +470 -48
  88. package/src/interfaces/graph.ts +1 -1
  89. package/src/types/common.ts +2 -2
  90. package/src/types/data-structures/binary-tree/segment-tree.ts +1 -1
  91. package/src/types/data-structures/heap/heap.ts +1 -0
  92. package/src/types/data-structures/linked-list/skip-linked-list.ts +2 -1
  93. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
  94. package/src/types/utils/validate-type.ts +4 -4
@@ -17,6 +17,11 @@ import { ERR } from '../../common';
17
17
  *
18
18
  * - Iteration order is ascending by key.
19
19
  * - No node exposure: all APIs use keys/values only.
20
+ * @example
21
+ * // Set multiple key-value pairs
22
+ * const tm = new TreeMap<number, string>();
23
+ * tm.setMany([[1, 'a'], [2, 'b'], [3, 'c']]);
24
+ * console.log(tm.size); // 3;
20
25
  */
21
26
  export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | undefined]> {
22
27
  readonly #core: RedBlackTree<K, V>;
@@ -82,6 +87,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
82
87
  static createDefaultComparator<K>(): Comparator<K> {
83
88
  return (a: K, b: K): number => {
84
89
  if (typeof a === 'number' && typeof b === 'number') {
90
+ /* istanbul ignore next -- _validateKey prevents NaN from entering the tree */
85
91
  if (Number.isNaN(a) || Number.isNaN(b)) throw new TypeError(ERR.invalidNaN('TreeMap'));
86
92
  const aa = Object.is(a, -0) ? 0 : a;
87
93
  const bb = Object.is(b, -0) ? 0 : b;
@@ -95,6 +101,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
95
101
  if (a instanceof Date && b instanceof Date) {
96
102
  const ta = a.getTime();
97
103
  const tb = b.getTime();
104
+ /* istanbul ignore next -- _validateKey prevents invalid Date from entering the tree */
98
105
  if (Number.isNaN(ta) || Number.isNaN(tb)) throw new TypeError(ERR.invalidDate('TreeMap'));
99
106
  return ta > tb ? 1 : ta < tb ? -1 : 0;
100
107
  }
@@ -130,6 +137,152 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
130
137
 
131
138
  /**
132
139
  * Whether the map is empty.
140
+
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+
216
+
217
+
218
+
219
+
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+
230
+
231
+
232
+
233
+
234
+
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+
254
+
255
+
256
+
257
+
258
+
259
+
260
+
261
+
262
+
263
+
264
+
265
+
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+ * @example
284
+ * // Check empty
285
+ * console.log(new TreeMap().isEmpty()); // true;
133
286
  */
134
287
  isEmpty(): boolean {
135
288
  return this.size === 0;
@@ -138,6 +291,178 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
138
291
  /**
139
292
  * Set or overwrite a value for a key.
140
293
  * @remarks Expected time O(log n)
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+
326
+
327
+
328
+
329
+
330
+
331
+
332
+
333
+
334
+
335
+
336
+
337
+
338
+
339
+
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+
350
+
351
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+
402
+
403
+
404
+
405
+
406
+
407
+
408
+
409
+
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+ * @example
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
+ * // ];
141
466
  */
142
467
  set(key: K, value: V | undefined): this {
143
468
  this._validateKey(key);
@@ -148,6 +473,171 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
148
473
  /**
149
474
  * Get the value under a key.
150
475
  * @remarks Expected time O(log n)
476
+
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+
490
+
491
+
492
+
493
+
494
+
495
+
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+
513
+
514
+
515
+
516
+
517
+
518
+
519
+
520
+
521
+
522
+
523
+
524
+
525
+
526
+
527
+
528
+
529
+
530
+
531
+
532
+
533
+
534
+
535
+
536
+
537
+
538
+
539
+
540
+
541
+
542
+
543
+
544
+
545
+
546
+
547
+
548
+
549
+
550
+
551
+
552
+
553
+
554
+
555
+
556
+
557
+
558
+
559
+
560
+
561
+
562
+
563
+
564
+
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+
580
+
581
+
582
+
583
+
584
+
585
+
586
+
587
+
588
+
589
+
590
+
591
+
592
+
593
+
594
+
595
+
596
+
597
+
598
+
599
+
600
+
601
+
602
+
603
+
604
+
605
+
606
+
607
+
608
+
609
+
610
+
611
+
612
+
613
+
614
+
615
+
616
+
617
+
618
+
619
+
620
+
621
+
622
+
623
+
624
+
625
+
626
+
627
+
628
+
629
+
630
+ * @example
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;
151
641
  */
152
642
  get(key: K): V | undefined {
153
643
  this._validateKey(key);
@@ -157,6 +647,170 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
157
647
  /**
158
648
  * Test whether a key exists.
159
649
  * @remarks Expected time O(log n)
650
+
651
+
652
+
653
+
654
+
655
+
656
+
657
+
658
+
659
+
660
+
661
+
662
+
663
+
664
+
665
+
666
+
667
+
668
+
669
+
670
+
671
+
672
+
673
+
674
+
675
+
676
+
677
+
678
+
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+
688
+
689
+
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+
698
+
699
+
700
+
701
+
702
+
703
+
704
+
705
+
706
+
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+
715
+
716
+
717
+
718
+
719
+
720
+
721
+
722
+
723
+
724
+
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+
737
+
738
+
739
+
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+
748
+
749
+
750
+
751
+
752
+
753
+
754
+
755
+
756
+
757
+
758
+
759
+
760
+
761
+
762
+
763
+
764
+
765
+
766
+
767
+
768
+
769
+
770
+
771
+
772
+
773
+
774
+
775
+
776
+
777
+
778
+
779
+
780
+
781
+
782
+
783
+
784
+
785
+
786
+
787
+
788
+
789
+
790
+
791
+
792
+
793
+
794
+
795
+
796
+
797
+
798
+
799
+
800
+
801
+
802
+
803
+
804
+ * @example
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;
160
814
  */
161
815
  has(key: K): boolean {
162
816
  this._validateKey(key);
@@ -167,6 +821,172 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
167
821
  * Delete a key.
168
822
  * @returns `true` if the key existed; otherwise `false`.
169
823
  * @remarks Expected time O(log n)
824
+
825
+
826
+
827
+
828
+
829
+
830
+
831
+
832
+
833
+
834
+
835
+
836
+
837
+
838
+
839
+
840
+
841
+
842
+
843
+
844
+
845
+
846
+
847
+
848
+
849
+
850
+
851
+
852
+
853
+
854
+
855
+
856
+
857
+
858
+
859
+
860
+
861
+
862
+
863
+
864
+
865
+
866
+
867
+
868
+
869
+
870
+
871
+
872
+
873
+
874
+
875
+
876
+
877
+
878
+
879
+
880
+
881
+
882
+
883
+
884
+
885
+
886
+
887
+
888
+
889
+
890
+
891
+
892
+
893
+
894
+
895
+
896
+
897
+
898
+
899
+
900
+
901
+
902
+
903
+
904
+
905
+
906
+
907
+
908
+
909
+
910
+
911
+
912
+
913
+
914
+
915
+
916
+
917
+
918
+
919
+
920
+
921
+
922
+
923
+
924
+
925
+
926
+
927
+
928
+
929
+
930
+
931
+
932
+
933
+
934
+
935
+
936
+
937
+
938
+
939
+
940
+
941
+
942
+
943
+
944
+
945
+
946
+
947
+
948
+
949
+
950
+
951
+
952
+
953
+
954
+
955
+
956
+
957
+
958
+
959
+
960
+
961
+
962
+
963
+
964
+
965
+
966
+
967
+
968
+
969
+
970
+
971
+
972
+
973
+
974
+
975
+
976
+
977
+
978
+ * @example
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;
170
990
  */
171
991
  delete(key: K): boolean {
172
992
  this._validateKey(key);
@@ -176,6 +996,154 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
176
996
 
177
997
  /**
178
998
  * Remove all entries.
999
+
1000
+
1001
+
1002
+
1003
+
1004
+
1005
+
1006
+
1007
+
1008
+
1009
+
1010
+
1011
+
1012
+
1013
+
1014
+
1015
+
1016
+
1017
+
1018
+
1019
+
1020
+
1021
+
1022
+
1023
+
1024
+
1025
+
1026
+
1027
+
1028
+
1029
+
1030
+
1031
+
1032
+
1033
+
1034
+
1035
+
1036
+
1037
+
1038
+
1039
+
1040
+
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+
1047
+
1048
+
1049
+
1050
+
1051
+
1052
+
1053
+
1054
+
1055
+
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
+ * @example
1143
+ * // Remove all
1144
+ * const tm = new TreeMap<number, string>([[1, 'a']]);
1145
+ * tm.clear();
1146
+ * console.log(tm.isEmpty()); // true;
179
1147
  */
180
1148
  clear(): void {
181
1149
  this.#core.clear();
@@ -183,6 +1151,153 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
183
1151
 
184
1152
  /**
185
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];
186
1301
  */
187
1302
  keys(): IterableIterator<K> {
188
1303
  return this.#core.keys();
@@ -198,6 +1313,153 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
198
1313
  * Iterate over values in ascending key order.
199
1314
  *
200
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'];
201
1463
  */
202
1464
  *values(): IterableIterator<V | undefined> {
203
1465
  for (const k of this.keys()) yield this._entryFromKey(k)[1];
@@ -207,6 +1469,153 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
207
1469
  * Iterate over `[key, value]` entries in ascending key order.
208
1470
  *
209
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']];
210
1619
  */
211
1620
  *entries(): IterableIterator<[K, V | undefined]> {
212
1621
  for (const k of this.keys()) yield this._entryFromKey(k);
@@ -220,8 +1629,157 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
220
1629
  * Visit each entry in ascending key order.
221
1630
  *
222
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'];
223
1781
  */
224
- forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: any): void {
1782
+ forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: unknown): void {
225
1783
  for (const [k, v] of this) cb.call(thisArg, v, k, this);
226
1784
  }
227
1785
 
@@ -230,6 +1788,154 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
230
1788
  *
231
1789
  * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
232
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];
233
1939
  */
234
1940
  map<MK, MV>(
235
1941
  callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
@@ -250,6 +1956,154 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
250
1956
  /**
251
1957
  * Create a new TreeMap containing only entries that satisfy the predicate.
252
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];
253
2107
  */
254
2108
  filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
255
2109
  const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
@@ -266,6 +2120,153 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
266
2120
  /**
267
2121
  * Reduce entries into a single accumulator.
268
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;
269
2270
  */
270
2271
  reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
271
2272
  let acc = initialValue;
@@ -277,6 +2278,151 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
277
2278
  /**
278
2279
  * Test whether all entries satisfy a predicate.
279
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;
280
2426
  */
281
2427
  every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
282
2428
  let index = 0;
@@ -292,6 +2438,151 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
292
2438
  /**
293
2439
  * Test whether any entry satisfies a predicate.
294
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;
295
2586
  */
296
2587
  some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
297
2588
  let index = 0;
@@ -308,6 +2599,151 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
308
2599
  * Find the first entry that satisfies a predicate.
309
2600
  * @returns The first matching `[key, value]` tuple, or `undefined`.
310
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;
311
2747
  */
312
2748
  find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
313
2749
  let index = 0;
@@ -323,6 +2759,153 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
323
2759
  /**
324
2760
  * Materialize the map into an array of `[key, value]` tuples.
325
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']];
326
2909
  */
327
2910
  toArray(): Array<[K, V | undefined]> {
328
2911
  return [...this];
@@ -331,6 +2914,153 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
331
2914
  /**
332
2915
  * Print a human-friendly representation.
333
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();
334
3064
  */
335
3065
  print(): void {
336
3066
  // Delegate to the underlying tree's visualization.
@@ -342,6 +3072,64 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
342
3072
 
343
3073
  /**
344
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;
345
3133
  */
346
3134
  first(): [K, V | undefined] | undefined {
347
3135
  const k = this.#core.getLeftMost();
@@ -350,6 +3138,48 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
350
3138
 
351
3139
  /**
352
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'];
353
3183
  */
354
3184
  last(): [K, V | undefined] | undefined {
355
3185
  const k = this.#core.getRightMost();
@@ -358,6 +3188,50 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
358
3188
 
359
3189
  /**
360
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;
361
3235
  */
362
3236
  pollFirst(): [K, V | undefined] | undefined {
363
3237
  const entry = this.first();
@@ -368,6 +3242,50 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
368
3242
 
369
3243
  /**
370
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'];
371
3289
  */
372
3290
  pollLast(): [K, V | undefined] | undefined {
373
3291
  const entry = this.last();
@@ -378,6 +3296,159 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
378
3296
 
379
3297
  /**
380
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');
3426
+ * const lunch = new Date('2024-01-15T12:00:00Z');
3427
+ * const review = new Date('2024-01-15T15:00:00Z');
3428
+ * const standup = new Date('2024-01-15T09:00:00Z');
3429
+ *
3430
+ * events.set(meeting, 'Team Meeting');
3431
+ * events.set(lunch, 'Lunch Break');
3432
+ * events.set(review, 'Code Review');
3433
+ * events.set(standup, 'Daily Standup');
3434
+ *
3435
+ * // Events are sorted chronologically
3436
+ * console.log([...events.values()]); // [
3437
+ * // 'Daily Standup',
3438
+ * // 'Team Meeting',
3439
+ * // 'Lunch Break',
3440
+ * // 'Code Review'
3441
+ * // ];
3442
+ *
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'];
381
3452
  */
382
3453
  ceiling(key: K): [K, V | undefined] | undefined {
383
3454
  this._validateKey(key);
@@ -387,6 +3458,143 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
387
3458
 
388
3459
  /**
389
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;
390
3598
  */
391
3599
  floor(key: K): [K, V | undefined] | undefined {
392
3600
  this._validateKey(key);
@@ -396,6 +3604,143 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
396
3604
 
397
3605
  /**
398
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
+ * ]);
3737
+ *
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;
399
3744
  */
400
3745
  higher(key: K): [K, V | undefined] | undefined {
401
3746
  this._validateKey(key);
@@ -405,6 +3750,141 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
405
3750
 
406
3751
  /**
407
3752
  * Largest entry whose key is < the given key.
3753
+
3754
+
3755
+
3756
+
3757
+
3758
+
3759
+
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+
3770
+
3771
+
3772
+
3773
+
3774
+
3775
+
3776
+
3777
+
3778
+
3779
+
3780
+
3781
+
3782
+
3783
+
3784
+
3785
+
3786
+
3787
+
3788
+
3789
+
3790
+
3791
+
3792
+
3793
+
3794
+
3795
+
3796
+
3797
+
3798
+
3799
+
3800
+
3801
+
3802
+
3803
+
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
+ * @example
3876
+ * // Find the largest key strictly < target
3877
+ * const temps = new TreeMap<number, string>([
3878
+ * [0, 'Freezing'],
3879
+ * [20, 'Cool'],
3880
+ * [30, 'Warm'],
3881
+ * [40, 'Hot']
3882
+ * ]);
3883
+ *
3884
+ * // Largest reading below 30
3885
+ * console.log(temps.lower(30)); // [20, 'Cool'];
3886
+ * // Nothing below 0
3887
+ * console.log(temps.lower(0)); // undefined;
408
3888
  */
409
3889
  lower(key: K): [K, V | undefined] | undefined {
410
3890
  this._validateKey(key);
@@ -417,6 +3897,158 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
417
3897
  *
418
3898
  * @param range `[low, high]`
419
3899
  * @param options Inclusive/exclusive bounds (defaults to inclusive).
3900
+
3901
+
3902
+
3903
+
3904
+
3905
+
3906
+
3907
+
3908
+
3909
+
3910
+
3911
+
3912
+
3913
+
3914
+
3915
+
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
+
4001
+
4002
+
4003
+
4004
+
4005
+
4006
+
4007
+
4008
+
4009
+
4010
+
4011
+
4012
+
4013
+
4014
+
4015
+
4016
+
4017
+
4018
+
4019
+
4020
+
4021
+
4022
+ * @example
4023
+ * // Inventory system with price-sorted products
4024
+ * interface Product {
4025
+ * name: string;
4026
+ * price: number;
4027
+ * stock: number;
4028
+ * }
4029
+ *
4030
+ * const inventory = new TreeMap<string, Product, Product>(
4031
+ * [
4032
+ * { name: 'Widget', price: 9.99, stock: 100 },
4033
+ * { name: 'Gadget', price: 24.99, stock: 50 },
4034
+ * { name: 'Doohickey', price: 4.99, stock: 200 }
4035
+ * ],
4036
+ * { toEntryFn: p => [p.name, p] }
4037
+ * );
4038
+ *
4039
+ * // Sorted alphabetically by product name
4040
+ * console.log([...inventory.keys()]); // ['Doohickey', 'Gadget', 'Widget'];
4041
+ *
4042
+ * // Filter high-stock items
4043
+ * const highStock = inventory.filter(p => (p?.stock ?? 0) > 75);
4044
+ * console.log([...highStock.keys()]); // ['Doohickey', 'Widget'];
4045
+ *
4046
+ * // Calculate total inventory value
4047
+ * const totalValue = inventory.reduce(
4048
+ * (sum, p) => sum + (p ? p.price * p.stock : 0),
4049
+ * 0
4050
+ * );
4051
+ * console.log(totalValue); // toBeCloseTo;
420
4052
  */
421
4053
  rangeSearch(range: [K, K], options: TreeMapRangeOptions = {}): Array<[K, V | undefined]> {
422
4054
  const { lowInclusive = true, highInclusive = true } = options;
@@ -429,7 +4061,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
429
4061
  const cmp = this.#core.comparator;
430
4062
 
431
4063
  for (const k of keys) {
432
- if (k === undefined) continue;
4064
+ /* istanbul ignore next -- defensive: tree keys are never undefined */ if (k === undefined) continue;
433
4065
  if (!lowInclusive && cmp(k, low) === 0) continue;
434
4066
  if (!highInclusive && cmp(k, high) === 0) continue;
435
4067
  out.push(this._entryFromKey(k));
@@ -441,11 +4073,156 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
441
4073
  /**
442
4074
  * Creates a shallow clone of this map.
443
4075
  * @remarks Time O(n log n), Space O(n)
444
- * @example
445
- * const original = new TreeMap([['a', 1], ['b', 2]]);
446
- * const copy = original.clone();
447
- * copy.set('c', 3);
448
- * original.has('c'); // false (original unchanged)
4076
+
4077
+
4078
+
4079
+
4080
+
4081
+
4082
+
4083
+
4084
+
4085
+
4086
+
4087
+
4088
+
4089
+
4090
+
4091
+
4092
+
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
+
4199
+
4200
+
4201
+
4202
+
4203
+
4204
+
4205
+
4206
+
4207
+
4208
+
4209
+
4210
+
4211
+
4212
+
4213
+
4214
+
4215
+
4216
+
4217
+
4218
+
4219
+
4220
+ * @example
4221
+ * // Deep clone
4222
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
4223
+ * const copy = tm.clone();
4224
+ * copy.delete(1);
4225
+ * console.log(tm.has(1)); // true;
449
4226
  */
450
4227
  clone(): TreeMap<K, V> {
451
4228
  return new TreeMap<K, V>(this, {