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
@@ -11,17 +11,6 @@ import { ERR, Range } from '../../common';
11
11
  import { RedBlackTree, RedBlackTreeNode } from './red-black-tree';
12
12
  import { TreeSet } from './tree-set';
13
13
 
14
- /**
15
- * Node type used by TreeMultiMap (alias to RedBlackTreeNode for backward compatibility).
16
- *
17
- * @deprecated Direct node manipulation is discouraged. Use TreeMultiMap methods instead.
18
- */
19
- export class TreeMultiMapNode<K = any, V = any> extends RedBlackTreeNode<K, V[]> {
20
- constructor(key: K, value: V[] = []) {
21
- super(key, value);
22
- }
23
- }
24
-
25
14
  /**
26
15
  * TreeMultiMap (ordered MultiMap) — key → bucket (Array of values).
27
16
  *
@@ -31,169 +20,10 @@ export class TreeMultiMapNode<K = any, V = any> extends RedBlackTreeNode<K, V[]>
31
20
  * - Default iteration yields bucket entries: `[K, V[]]`.
32
21
  * - Navigable operations (`first/last/ceiling/...`) return entry tuples like TreeMap.
33
22
  * @example
34
- * // players ranked by score with their equipment
35
- * type Equipment = {
36
- * name: string; // Equipment name
37
- * quality: 'legendary' | 'epic' | 'rare' | 'common';
38
- * level: number;
39
- * };
40
- *
41
- * type Player = {
42
- * name: string;
43
- * score: number;
44
- * equipments: Equipment[];
45
- * };
46
- *
47
- * // Mock player data with their scores and equipment
48
- * const players: Player[] = [
49
- * {
50
- * name: 'DragonSlayer',
51
- * score: 8750,
52
- * equipments: [
53
- * { name: 'AWM', quality: 'legendary', level: 85 },
54
- * { name: 'Level 3 Helmet', quality: 'epic', level: 80 },
55
- * { name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
56
- * { name: 'Compensator', quality: 'epic', level: 78 },
57
- * { name: 'Vertical Grip', quality: 'rare', level: 72 }
58
- * ]
59
- * },
60
- * {
61
- * name: 'ShadowNinja',
62
- * score: 7200,
63
- * equipments: [
64
- * { name: 'M416', quality: 'epic', level: 75 },
65
- * { name: 'Ghillie Suit', quality: 'rare', level: 70 },
66
- * { name: 'Red Dot Sight', quality: 'common', level: 65 },
67
- * { name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
68
- * ]
69
- * },
70
- * {
71
- * name: 'RuneMaster',
72
- * score: 9100,
73
- * equipments: [
74
- * { name: 'KAR98K', quality: 'legendary', level: 90 },
75
- * { name: 'Level 3 Vest', quality: 'legendary', level: 85 },
76
- * { name: 'Holographic Sight', quality: 'epic', level: 82 },
77
- * { name: 'Suppressor', quality: 'legendary', level: 88 },
78
- * { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
79
- * ]
80
- * },
81
- * {
82
- * name: 'BattleKing',
83
- * score: 8500,
84
- * equipments: [
85
- * { name: 'AUG', quality: 'epic', level: 82 },
86
- * { name: 'Red Dot Sight', quality: 'rare', level: 75 },
87
- * { name: 'Extended Mag', quality: 'common', level: 70 },
88
- * { name: 'Tactical Stock', quality: 'rare', level: 76 }
89
- * ]
90
- * },
91
- * {
92
- * name: 'SniperElite',
93
- * score: 7800,
94
- * equipments: [
95
- * { name: 'M24', quality: 'legendary', level: 88 },
96
- * { name: 'Compensator', quality: 'epic', level: 80 },
97
- * { name: 'Scope 8x', quality: 'legendary', level: 85 },
98
- * { name: 'Level 2 Helmet', quality: 'rare', level: 75 }
99
- * ]
100
- * },
101
- * {
102
- * name: 'RushMaster',
103
- * score: 7500,
104
- * equipments: [
105
- * { name: 'Vector', quality: 'rare', level: 72 },
106
- * { name: 'Level 2 Helmet', quality: 'common', level: 65 },
107
- * { name: 'Quickdraw Mag', quality: 'common', level: 60 },
108
- * { name: 'Laser Sight', quality: 'rare', level: 68 }
109
- * ]
110
- * },
111
- * {
112
- * name: 'GhostWarrior',
113
- * score: 8200,
114
- * equipments: [
115
- * { name: 'SCAR-L', quality: 'epic', level: 78 },
116
- * { name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
117
- * { name: 'Holographic Sight', quality: 'epic', level: 75 },
118
- * { name: 'Suppressor', quality: 'rare', level: 72 },
119
- * { name: 'Vertical Grip', quality: 'common', level: 65 }
120
- * ]
121
- * },
122
- * {
123
- * name: 'DeathDealer',
124
- * score: 7300,
125
- * equipments: [
126
- * { name: 'SKS', quality: 'epic', level: 76 },
127
- * { name: 'Holographic Sight', quality: 'rare', level: 68 },
128
- * { name: 'Extended Mag', quality: 'common', level: 65 }
129
- * ]
130
- * },
131
- * {
132
- * name: 'StormRider',
133
- * score: 8900,
134
- * equipments: [
135
- * { name: 'MK14', quality: 'legendary', level: 92 },
136
- * { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
137
- * { name: 'Scope 8x', quality: 'epic', level: 80 },
138
- * { name: 'Suppressor', quality: 'legendary', level: 88 },
139
- * { name: 'Tactical Stock', quality: 'rare', level: 75 }
140
- * ]
141
- * },
142
- * {
143
- * name: 'CombatLegend',
144
- * score: 7600,
145
- * equipments: [
146
- * { name: 'UMP45', quality: 'rare', level: 74 },
147
- * { name: 'Level 2 Vest', quality: 'common', level: 67 },
148
- * { name: 'Red Dot Sight', quality: 'common', level: 62 },
149
- * { name: 'Extended Mag', quality: 'rare', level: 70 }
150
- * ]
151
- * }
152
- * ];
153
- *
154
- * // Create a TreeMultiMap for player rankings
155
- * const playerRankings = new TreeMultiMap<number, Equipment, Player>(players, {
156
- * toEntryFn: ({ score, equipments }) => [score, equipments],
157
- * isMapMode: false
158
- * });
159
- *
160
- * const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node.key));
161
- * console.log(topPlayersEquipments); // [
162
- * // [
163
- * // {
164
- * // name: 'MK14',
165
- * // quality: 'legendary',
166
- * // level: 92
167
- * // },
168
- * // { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
169
- * // {
170
- * // name: 'Scope 8x',
171
- * // quality: 'epic',
172
- * // level: 80
173
- * // },
174
- * // { name: 'Suppressor', quality: 'legendary', level: 88 },
175
- * // {
176
- * // name: 'Tactical Stock',
177
- * // quality: 'rare',
178
- * // level: 75
179
- * // }
180
- * // ],
181
- * // [
182
- * // { name: 'KAR98K', quality: 'legendary', level: 90 },
183
- * // {
184
- * // name: 'Level 3 Vest',
185
- * // quality: 'legendary',
186
- * // level: 85
187
- * // },
188
- * // { name: 'Holographic Sight', quality: 'epic', level: 82 },
189
- * // {
190
- * // name: 'Suppressor',
191
- * // quality: 'legendary',
192
- * // level: 88
193
- * // },
194
- * // { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
195
- * // ]
196
- * // ];
23
+ * // Morris traversal (O(1) space)
24
+ * const tmm = new TreeMultiMap<number>([5, 3, 7]);
25
+ * const result = tmm.morris(n => n.key, 'IN');
26
+ * console.log(result.length); // > 0;
197
27
  */
198
28
  export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]]> {
199
29
  readonly #core: RedBlackTree<K, V[], R>;
@@ -283,6 +113,152 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
283
113
  /**
284
114
  * Whether the map is empty.
285
115
  * @remarks Time O(1), Space O(1)
116
+
117
+
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+
134
+
135
+
136
+
137
+
138
+
139
+
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
+ * @example
260
+ * // Check if empty
261
+ * console.log(new TreeMultiMap().isEmpty()); // true;
286
262
  */
287
263
  isEmpty(): boolean {
288
264
  return this.size === 0;
@@ -291,6 +267,155 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
291
267
  /**
292
268
  * Removes all entries from the map.
293
269
  * @remarks Time O(1), Space O(1)
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+
280
+
281
+
282
+
283
+
284
+
285
+
286
+
287
+
288
+
289
+
290
+
291
+
292
+
293
+
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
+ * @example
414
+ * // Remove all entries
415
+ * const mm = new TreeMultiMap<number, string>();
416
+ * mm.add(1, 'a');
417
+ * mm.clear();
418
+ * console.log(mm.isEmpty()); // true;
294
419
  */
295
420
  clear(): void {
296
421
  this.#core.clear();
@@ -299,6 +424,35 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
299
424
  /**
300
425
  * Bucket length for a key (missing => 0).
301
426
  * @remarks Time O(log n), Space O(1)
427
+
428
+
429
+
430
+
431
+
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+
442
+
443
+
444
+
445
+
446
+
447
+
448
+
449
+
450
+ * @example
451
+ * // Count values for key
452
+ * const mm = new TreeMultiMap<number, string>();
453
+ * mm.add(1, 'a');
454
+ * mm.add(1, 'b');
455
+ * console.log(mm.count(1)); // 2;
302
456
  */
303
457
  count(key: K): number {
304
458
  const b = this.get(key);
@@ -308,6 +462,36 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
308
462
  /**
309
463
  * Total number of values across all buckets (Σ bucket.length).
310
464
  * @remarks Time O(n), Space O(1)
465
+
466
+
467
+
468
+
469
+
470
+
471
+
472
+
473
+
474
+
475
+
476
+
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+ * @example
489
+ * // Total number of values
490
+ * const mm = new TreeMultiMap<number, string>();
491
+ * mm.add(1, 'a');
492
+ * mm.add(1, 'b');
493
+ * mm.add(2, 'c');
494
+ * console.log(mm.totalSize); // 3;
311
495
  */
312
496
  get totalSize(): number {
313
497
  let sum = 0;
@@ -318,6 +502,190 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
318
502
  /**
319
503
  * Whether the map contains the given key.
320
504
  * @remarks Time O(log n), Space O(1)
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
+
631
+
632
+
633
+
634
+
635
+
636
+
637
+
638
+
639
+
640
+
641
+
642
+
643
+
644
+
645
+
646
+
647
+
648
+
649
+
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
+ * @example
684
+ * // Check key existence
685
+ * const mm = new TreeMultiMap<number, string>();
686
+ * mm.add(1, 'a');
687
+ * console.log(mm.has(1)); // true;
688
+ * console.log(mm.has(2)); // false;
321
689
  */
322
690
  has(key: K): boolean {
323
691
  this._validateKey(key);
@@ -327,6 +695,190 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
327
695
  /**
328
696
  * Live bucket reference (do not auto-delete key if bucket becomes empty via mutation).
329
697
  * @remarks Time O(log n), Space O(1)
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
+
805
+
806
+
807
+
808
+
809
+
810
+
811
+
812
+
813
+
814
+
815
+
816
+
817
+
818
+
819
+
820
+
821
+
822
+
823
+
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
+ * @example
877
+ * // Get values for key
878
+ * const mm = new TreeMultiMap<number, string>();
879
+ * mm.add(1, 'a');
880
+ * mm.add(1, 'b');
881
+ * console.log(mm.get(1)); // ['a', 'b'];
330
882
  */
331
883
  get(key: K): V[] | undefined {
332
884
  this._validateKey(key);
@@ -336,6 +888,150 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
336
888
  /**
337
889
  * Append a single value.
338
890
  * @remarks Time O(log n), Space O(1)
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
+
979
+
980
+
981
+
982
+
983
+
984
+
985
+
986
+
987
+
988
+
989
+
990
+
991
+
992
+
993
+
994
+
995
+
996
+
997
+
998
+
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
+ * @example
1029
+ * // Add key-value pair
1030
+ * const mm = new TreeMultiMap<number, string>();
1031
+ * mm.add(1, 'a');
1032
+ * mm.add(1, 'b');
1033
+ * mm.add(2, 'c');
1034
+ * console.log(mm.get(1)); // ['a', 'b'];
339
1035
  */
340
1036
  add(key: K, value: V): boolean {
341
1037
  this._validateKey(key);
@@ -350,6 +1046,188 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
350
1046
  /**
351
1047
  * Alias for compatibility with existing TreeMultiMap semantics.
352
1048
  * @remarks Time O(log n), Space O(1) for single value; O(log n + m) for bucket append
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
+
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+
1151
+
1152
+
1153
+
1154
+
1155
+
1156
+
1157
+
1158
+
1159
+
1160
+
1161
+
1162
+
1163
+
1164
+
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+
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
+ * @example
1226
+ * // Set values for key
1227
+ * const mm = new TreeMultiMap<number, string>();
1228
+ * mm.set(1, 'a');
1229
+ * mm.set(1, 'b');
1230
+ * console.log(mm.get(1)); // ['a', 'b'];
353
1231
  */
354
1232
  set(entry: [K | null | undefined, V[] | undefined] | K | null | undefined, value?: V): boolean;
355
1233
  set(key: K, value: V): boolean;
@@ -379,6 +1257,191 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
379
1257
  /**
380
1258
  * Deletes a key and its entire bucket.
381
1259
  * @remarks Time O(log n), Space O(1)
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+
1301
+
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+
1312
+
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+
1345
+
1346
+
1347
+
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
+ * @example
1439
+ * // Remove key
1440
+ * const mm = new TreeMultiMap<number, string>();
1441
+ * mm.add(1, 'a');
1442
+ * mm.add(2, 'b');
1443
+ * mm.delete(1);
1444
+ * console.log(mm.has(1)); // false;
382
1445
  */
383
1446
  delete(key: K): boolean {
384
1447
  this._validateKey(key);
@@ -388,6 +1451,35 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
388
1451
  /**
389
1452
  * Check if a specific value exists in a key's bucket.
390
1453
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+
1472
+
1473
+
1474
+
1475
+
1476
+
1477
+ * @example
1478
+ * // Check specific key-value
1479
+ * const mm = new TreeMultiMap<number, string>();
1480
+ * mm.add(1, 'a');
1481
+ * console.log(mm.hasEntry(1, 'a')); // true;
1482
+ * console.log(mm.hasEntry(1, 'z')); // false;
391
1483
  */
392
1484
  hasEntry(key: K, value: V, eq: (a: V, b: V) => boolean = Object.is): boolean {
393
1485
  const bucket = this.get(key);
@@ -398,6 +1490,36 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
398
1490
  /**
399
1491
  * Delete a single occurrence of a value from a key's bucket.
400
1492
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
1493
+
1494
+
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+
1502
+
1503
+
1504
+
1505
+
1506
+
1507
+
1508
+
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+
1516
+ * @example
1517
+ * // Delete specific value
1518
+ * const mm = new TreeMultiMap<number, string>();
1519
+ * mm.add(1, 'a');
1520
+ * mm.add(1, 'b');
1521
+ * mm.deleteValue(1, 'a');
1522
+ * console.log(mm.get(1)); // ['b'];
401
1523
  */
402
1524
  deleteValue(key: K, value: V, eq: (a: V, b: V) => boolean = Object.is): boolean {
403
1525
  const bucket = this.get(key);
@@ -412,6 +1534,37 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
412
1534
  /**
413
1535
  * Delete all occurrences of a value from a key's bucket.
414
1536
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+
1544
+
1545
+
1546
+
1547
+
1548
+
1549
+
1550
+
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+ * @example
1561
+ * // Delete all matching values
1562
+ * const mm = new TreeMultiMap<number, string>();
1563
+ * mm.add(1, 'a');
1564
+ * mm.add(1, 'a');
1565
+ * mm.add(1, 'b');
1566
+ * const count = mm.deleteValues(1, 'a');
1567
+ * console.log(count); // 2;
415
1568
  */
416
1569
  deleteValues(key: K, value: V, eq: (a: V, b: V) => boolean = Object.is): number {
417
1570
  const bucket = this.get(key);
@@ -436,13 +1589,162 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
436
1589
  *[Symbol.iterator](): Iterator<[K, V[]]> {
437
1590
  for (const [k, v] of this.#core) {
438
1591
  // core always stores buckets, but guard anyway
439
- yield [k, v ?? ([] as V[])];
1592
+ yield [k, v ?? /* istanbul ignore next */ ([] as V[])];
440
1593
  }
441
1594
  }
442
1595
 
443
1596
  /**
444
1597
  * Iterates over all keys.
445
1598
  * @remarks Time O(n), Space O(1)
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+
1621
+
1622
+
1623
+
1624
+
1625
+
1626
+
1627
+
1628
+
1629
+
1630
+
1631
+
1632
+
1633
+
1634
+
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+
1647
+
1648
+
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+
1659
+
1660
+
1661
+
1662
+
1663
+
1664
+
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+
1687
+
1688
+
1689
+
1690
+
1691
+
1692
+
1693
+
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
+ * @example
1743
+ * // Iterate keys
1744
+ * const mm = new TreeMultiMap<number, string>();
1745
+ * mm.add(3, 'c');
1746
+ * mm.add(1, 'a');
1747
+ * console.log([...mm.keys()]); // [1, 3];
446
1748
  */
447
1749
  *keys(): IterableIterator<K> {
448
1750
  yield* this.#core.keys();
@@ -451,6 +1753,155 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
451
1753
  /**
452
1754
  * Iterates over all buckets.
453
1755
  * @remarks Time O(n), Space O(1)
1756
+
1757
+
1758
+
1759
+
1760
+
1761
+
1762
+
1763
+
1764
+
1765
+
1766
+
1767
+
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+
1800
+
1801
+
1802
+
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+
1813
+
1814
+
1815
+
1816
+
1817
+
1818
+
1819
+
1820
+
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+
1827
+
1828
+
1829
+
1830
+
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+
1844
+
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+
1855
+
1856
+
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
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
+ * @example
1900
+ * // Iterate value arrays
1901
+ * const mm = new TreeMultiMap<number, string>();
1902
+ * mm.add(1, 'a');
1903
+ * mm.add(1, 'b');
1904
+ * console.log([...mm.values()]); // [['a', 'b']];
454
1905
  */
455
1906
  *values(): IterableIterator<V[]> {
456
1907
  for (const [, bucket] of this) yield bucket;
@@ -461,6 +1912,35 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
461
1912
  /**
462
1913
  * Iterates over all entries for a specific key.
463
1914
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
1915
+
1916
+
1917
+
1918
+
1919
+
1920
+
1921
+
1922
+
1923
+
1924
+
1925
+
1926
+
1927
+
1928
+
1929
+
1930
+
1931
+
1932
+
1933
+
1934
+
1935
+
1936
+
1937
+
1938
+ * @example
1939
+ * // Get entries for key
1940
+ * const mm = new TreeMultiMap<number, string>();
1941
+ * mm.add(1, 'a');
1942
+ * mm.add(1, 'b');
1943
+ * console.log([...mm.entriesOf(1)]); // [[1, 'a'], [1, 'b']];
464
1944
  */
465
1945
  *entriesOf(key: K): IterableIterator<[K, V]> {
466
1946
  const bucket = this.get(key);
@@ -471,6 +1951,35 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
471
1951
  /**
472
1952
  * Iterates over all values for a specific key.
473
1953
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+
1972
+
1973
+
1974
+
1975
+
1976
+
1977
+ * @example
1978
+ * // Get flat values for key
1979
+ * const mm = new TreeMultiMap<number, string>();
1980
+ * mm.add(1, 'a');
1981
+ * mm.add(1, 'b');
1982
+ * console.log([...mm.valuesOf(1)]); // ['a', 'b'];
474
1983
  */
475
1984
  *valuesOf(key: K): IterableIterator<V> {
476
1985
  const bucket = this.get(key);
@@ -481,6 +1990,36 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
481
1990
  /**
482
1991
  * Iterates over all [key, value] pairs (flattened from buckets).
483
1992
  * @remarks Time O(T), Space O(1) where T is totalSize
1993
+
1994
+
1995
+
1996
+
1997
+
1998
+
1999
+
2000
+
2001
+
2002
+
2003
+
2004
+
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+
2013
+
2014
+
2015
+
2016
+ * @example
2017
+ * // All key-value pairs flattened
2018
+ * const mm = new TreeMultiMap<number, string>();
2019
+ * mm.add(1, 'a');
2020
+ * mm.add(1, 'b');
2021
+ * mm.add(2, 'c');
2022
+ * console.log([...mm.flatEntries()]); // [[1, 'a'], [1, 'b'], [2, 'c']];
484
2023
  */
485
2024
  *flatEntries(): IterableIterator<[K, V]> {
486
2025
  for (const [k, bucket] of this) {
@@ -493,38 +2032,184 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
493
2032
  /**
494
2033
  * Returns the entry with the smallest key.
495
2034
  * @remarks Time O(log n), Space O(1)
496
- * @example
497
- * const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
498
- * map.first(); // [1, ['a']]
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
+ * @example
2092
+ * // First entry
2093
+ * const mm = new TreeMultiMap<number, string>();
2094
+ * mm.add(3, 'c');
2095
+ * mm.add(1, 'a');
2096
+ * console.log(mm.first()?.[0]); // 1;
499
2097
  */
500
2098
  first(): [K, V[]] | undefined {
501
2099
  const k = this.#core.getLeftMost();
502
2100
  if (k === undefined) return undefined;
503
2101
  const b = this.get(k);
504
- return b === undefined ? undefined : [k, b];
2102
+ return b === undefined ? /* istanbul ignore next -- defensive: key in core always has bucket */ undefined : [k, b];
505
2103
  }
506
2104
 
507
2105
  /**
508
2106
  * Returns the entry with the largest key.
509
2107
  * @remarks Time O(log n), Space O(1)
510
- * @example
511
- * const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
512
- * map.last(); // [2, ['b']]
2108
+
2109
+
2110
+
2111
+
2112
+
2113
+
2114
+
2115
+
2116
+
2117
+
2118
+
2119
+
2120
+
2121
+
2122
+
2123
+
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+
2133
+
2134
+
2135
+
2136
+
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+
2152
+
2153
+
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+
2161
+
2162
+
2163
+
2164
+ * @example
2165
+ * // Last entry
2166
+ * const mm = new TreeMultiMap<number, string>();
2167
+ * mm.add(1, 'a');
2168
+ * mm.add(3, 'c');
2169
+ * console.log(mm.last()?.[0]); // 3;
513
2170
  */
514
2171
  last(): [K, V[]] | undefined {
515
2172
  const k = this.#core.getRightMost();
516
2173
  if (k === undefined) return undefined;
517
2174
  const b = this.get(k);
518
- return b === undefined ? undefined : [k, b];
2175
+ return b === undefined ? /* istanbul ignore next -- defensive: key in core always has bucket */ undefined : [k, b];
519
2176
  }
520
2177
 
521
2178
  /**
522
2179
  * Removes and returns the entry with the smallest key.
523
2180
  * @remarks Time O(log n), Space O(1)
524
- * @example
525
- * const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
526
- * map.pollFirst(); // [1, ['a']]
527
- * map.has(1); // false
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
+ * @example
2206
+ * // Remove and return first
2207
+ * const mm = new TreeMultiMap<number, string>();
2208
+ * mm.add(2, 'b');
2209
+ * mm.add(1, 'a');
2210
+ * const first = mm.pollFirst();
2211
+ * console.log(first?.[0]); // 1;
2212
+ * console.log(mm.has(1)); // false;
528
2213
  */
529
2214
  pollFirst(): [K, V[]] | undefined {
530
2215
  const e = this.first();
@@ -536,10 +2221,37 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
536
2221
  /**
537
2222
  * Removes and returns the entry with the largest key.
538
2223
  * @remarks Time O(log n), Space O(1)
539
- * @example
540
- * const map = new TreeMultiMap([[1, ['a']], [2, ['b']]]);
541
- * map.pollLast(); // [2, ['b']]
542
- * map.has(2); // false
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
+ * @example
2249
+ * // Remove and return last
2250
+ * const mm = new TreeMultiMap<number, string>();
2251
+ * mm.add(1, 'a');
2252
+ * mm.add(3, 'c');
2253
+ * const last = mm.pollLast();
2254
+ * console.log(last?.[0]); // 3;
543
2255
  */
544
2256
  pollLast(): [K, V[]] | undefined {
545
2257
  const e = this.last();
@@ -551,65 +2263,595 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
551
2263
  /**
552
2264
  * Returns the entry with the smallest key >= given key.
553
2265
  * @remarks Time O(log n), Space O(1)
554
- * @example
555
- * const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
556
- * map.ceiling(15); // [20, ['b']]
557
- * map.ceiling(20); // [20, ['b']]
2266
+
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+
2279
+
2280
+
2281
+
2282
+
2283
+
2284
+
2285
+
2286
+
2287
+
2288
+
2289
+
2290
+
2291
+
2292
+
2293
+
2294
+
2295
+
2296
+
2297
+
2298
+
2299
+
2300
+
2301
+
2302
+
2303
+
2304
+
2305
+
2306
+
2307
+
2308
+
2309
+
2310
+
2311
+
2312
+
2313
+
2314
+
2315
+
2316
+
2317
+
2318
+
2319
+
2320
+
2321
+
2322
+
2323
+
2324
+
2325
+
2326
+
2327
+
2328
+
2329
+
2330
+
2331
+
2332
+
2333
+
2334
+
2335
+
2336
+
2337
+
2338
+
2339
+
2340
+
2341
+
2342
+
2343
+
2344
+
2345
+
2346
+
2347
+
2348
+
2349
+
2350
+
2351
+
2352
+
2353
+
2354
+
2355
+
2356
+
2357
+
2358
+
2359
+
2360
+
2361
+
2362
+
2363
+
2364
+
2365
+
2366
+
2367
+
2368
+
2369
+
2370
+
2371
+
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+
2382
+
2383
+
2384
+
2385
+
2386
+
2387
+
2388
+
2389
+
2390
+
2391
+
2392
+
2393
+
2394
+
2395
+
2396
+
2397
+
2398
+
2399
+
2400
+
2401
+
2402
+
2403
+
2404
+
2405
+
2406
+
2407
+
2408
+
2409
+
2410
+
2411
+
2412
+ * @example
2413
+ * // Least key ≥ target
2414
+ * const mm = new TreeMultiMap<number, string>();
2415
+ * mm.add(10, 'a');
2416
+ * mm.add(20, 'b');
2417
+ * mm.add(30, 'c');
2418
+ * console.log(mm.ceiling(15)?.[0]); // 20;
558
2419
  */
559
2420
  ceiling(key: K): [K, V[]] | undefined {
560
2421
  this._validateKey(key);
561
2422
  const k = this.#core.ceiling(key);
562
2423
  if (k === undefined) return undefined;
563
2424
  const b = this.get(k);
564
- return b === undefined ? undefined : [k, b];
2425
+ return b === undefined ? /* istanbul ignore next -- defensive: key in core always has bucket */ undefined : [k, b];
565
2426
  }
566
2427
 
567
2428
  /**
568
2429
  * Returns the entry with the largest key <= given key.
569
2430
  * @remarks Time O(log n), Space O(1)
570
- * @example
571
- * const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
572
- * map.floor(25); // [20, ['b']]
573
- * map.floor(20); // [20, ['b']]
2431
+
2432
+
2433
+
2434
+
2435
+
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+
2450
+
2451
+
2452
+
2453
+
2454
+
2455
+
2456
+
2457
+
2458
+
2459
+
2460
+
2461
+
2462
+
2463
+
2464
+
2465
+
2466
+
2467
+
2468
+
2469
+
2470
+
2471
+
2472
+
2473
+
2474
+
2475
+
2476
+
2477
+
2478
+
2479
+
2480
+
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+
2488
+
2489
+
2490
+
2491
+
2492
+
2493
+
2494
+
2495
+
2496
+
2497
+
2498
+
2499
+
2500
+
2501
+
2502
+
2503
+
2504
+
2505
+
2506
+
2507
+
2508
+
2509
+
2510
+
2511
+
2512
+
2513
+
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+
2528
+
2529
+
2530
+
2531
+
2532
+
2533
+
2534
+
2535
+
2536
+
2537
+
2538
+
2539
+
2540
+
2541
+
2542
+
2543
+
2544
+
2545
+
2546
+
2547
+
2548
+
2549
+
2550
+
2551
+
2552
+
2553
+
2554
+
2555
+
2556
+
2557
+
2558
+
2559
+
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+
2566
+
2567
+
2568
+
2569
+
2570
+
2571
+
2572
+
2573
+
2574
+
2575
+
2576
+
2577
+ * @example
2578
+ * // Greatest key ≤ target
2579
+ * const mm = new TreeMultiMap<number, string>();
2580
+ * mm.add(10, 'a');
2581
+ * mm.add(20, 'b');
2582
+ * mm.add(30, 'c');
2583
+ * console.log(mm.floor(25)?.[0]); // 20;
574
2584
  */
575
2585
  floor(key: K): [K, V[]] | undefined {
576
2586
  this._validateKey(key);
577
2587
  const k = this.#core.floor(key);
578
2588
  if (k === undefined) return undefined;
579
2589
  const b = this.get(k);
580
- return b === undefined ? undefined : [k, b];
2590
+ return b === undefined ? /* istanbul ignore next -- defensive: key in core always has bucket */ undefined : [k, b];
581
2591
  }
582
2592
 
583
2593
  /**
584
2594
  * Returns the entry with the smallest key > given key.
585
2595
  * @remarks Time O(log n), Space O(1)
586
- * @example
587
- * const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
588
- * map.higher(10); // [20, ['b']]
589
- * map.higher(15); // [20, ['b']]
2596
+
2597
+
2598
+
2599
+
2600
+
2601
+
2602
+
2603
+
2604
+
2605
+
2606
+
2607
+
2608
+
2609
+
2610
+
2611
+
2612
+
2613
+
2614
+
2615
+
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+
2626
+
2627
+
2628
+
2629
+
2630
+
2631
+
2632
+
2633
+
2634
+
2635
+
2636
+
2637
+
2638
+
2639
+
2640
+
2641
+
2642
+
2643
+
2644
+
2645
+
2646
+
2647
+
2648
+
2649
+
2650
+
2651
+
2652
+
2653
+
2654
+
2655
+
2656
+
2657
+
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+
2682
+
2683
+
2684
+
2685
+
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+
2692
+
2693
+
2694
+
2695
+
2696
+
2697
+
2698
+
2699
+
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+
2710
+ * @example
2711
+ * // Least key > target
2712
+ * const mm = new TreeMultiMap<number, string>();
2713
+ * mm.add(10, 'a');
2714
+ * mm.add(20, 'b');
2715
+ * console.log(mm.higher(10)?.[0]); // 20;
590
2716
  */
591
2717
  higher(key: K): [K, V[]] | undefined {
592
2718
  this._validateKey(key);
593
2719
  const k = this.#core.higher(key);
594
2720
  if (k === undefined) return undefined;
595
2721
  const b = this.get(k);
596
- return b === undefined ? undefined : [k, b];
2722
+ return b === undefined ? /* istanbul ignore next -- defensive: key in core always has bucket */ undefined : [k, b];
597
2723
  }
598
2724
 
599
2725
  /**
600
2726
  * Returns the entry with the largest key < given key.
601
2727
  * @remarks Time O(log n), Space O(1)
602
- * @example
603
- * const map = new TreeMultiMap([[10, ['a']], [20, ['b']], [30, ['c']]]);
604
- * map.lower(20); // [10, ['a']]
605
- * map.lower(15); // [10, ['a']]
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+
2738
+
2739
+
2740
+
2741
+
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2748
+
2749
+
2750
+
2751
+
2752
+
2753
+
2754
+
2755
+
2756
+
2757
+
2758
+
2759
+
2760
+
2761
+
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
+ * @example
2843
+ * // Greatest key < target
2844
+ * const mm = new TreeMultiMap<number, string>();
2845
+ * mm.add(10, 'a');
2846
+ * mm.add(20, 'b');
2847
+ * console.log(mm.lower(20)?.[0]); // 10;
606
2848
  */
607
2849
  lower(key: K): [K, V[]] | undefined {
608
2850
  this._validateKey(key);
609
2851
  const k = this.#core.lower(key);
610
2852
  if (k === undefined) return undefined;
611
2853
  const b = this.get(k);
612
- return b === undefined ? undefined : [k, b];
2854
+ return b === undefined ? /* istanbul ignore next -- defensive: key in core always has bucket */ undefined : [k, b];
613
2855
  }
614
2856
 
615
2857
  // ━━━ Tree utilities ━━━
@@ -617,6 +2859,154 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
617
2859
  /**
618
2860
  * Prints the internal tree structure (for debugging).
619
2861
  * @remarks Time O(n), Space O(n)
2862
+
2863
+
2864
+
2865
+
2866
+
2867
+
2868
+
2869
+
2870
+
2871
+
2872
+
2873
+
2874
+
2875
+
2876
+
2877
+
2878
+
2879
+
2880
+
2881
+
2882
+
2883
+
2884
+
2885
+
2886
+
2887
+
2888
+
2889
+
2890
+
2891
+
2892
+
2893
+
2894
+
2895
+
2896
+
2897
+
2898
+
2899
+
2900
+
2901
+
2902
+
2903
+
2904
+
2905
+
2906
+
2907
+
2908
+
2909
+
2910
+
2911
+
2912
+
2913
+
2914
+
2915
+
2916
+
2917
+
2918
+
2919
+
2920
+
2921
+
2922
+
2923
+
2924
+
2925
+
2926
+
2927
+
2928
+
2929
+
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
+ * @example
3006
+ * // Display tree
3007
+ * const mm = new TreeMultiMap<number, string>();
3008
+ * mm.add(1, 'a');
3009
+ * expect(() => mm.print()).not.toThrow();
620
3010
  */
621
3011
  print(): void {
622
3012
  this.#core.print();
@@ -625,6 +3015,157 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
625
3015
  /**
626
3016
  * Executes a callback for each entry.
627
3017
  * @remarks Time O(n), Space O(1)
3018
+
3019
+
3020
+
3021
+
3022
+
3023
+
3024
+
3025
+
3026
+
3027
+
3028
+
3029
+
3030
+
3031
+
3032
+
3033
+
3034
+
3035
+
3036
+
3037
+
3038
+
3039
+
3040
+
3041
+
3042
+
3043
+
3044
+
3045
+
3046
+
3047
+
3048
+
3049
+
3050
+
3051
+
3052
+
3053
+
3054
+
3055
+
3056
+
3057
+
3058
+
3059
+
3060
+
3061
+
3062
+
3063
+
3064
+
3065
+
3066
+
3067
+
3068
+
3069
+
3070
+
3071
+
3072
+
3073
+
3074
+
3075
+
3076
+
3077
+
3078
+
3079
+
3080
+
3081
+
3082
+
3083
+
3084
+
3085
+
3086
+
3087
+
3088
+
3089
+
3090
+
3091
+
3092
+
3093
+
3094
+
3095
+
3096
+
3097
+
3098
+
3099
+
3100
+
3101
+
3102
+
3103
+
3104
+
3105
+
3106
+
3107
+
3108
+
3109
+
3110
+
3111
+
3112
+
3113
+
3114
+
3115
+
3116
+
3117
+
3118
+
3119
+
3120
+
3121
+
3122
+
3123
+
3124
+
3125
+
3126
+
3127
+
3128
+
3129
+
3130
+
3131
+
3132
+
3133
+
3134
+
3135
+
3136
+
3137
+
3138
+
3139
+
3140
+
3141
+
3142
+
3143
+
3144
+
3145
+
3146
+
3147
+
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+
3154
+
3155
+
3156
+
3157
+
3158
+
3159
+
3160
+
3161
+ * @example
3162
+ * // Iterate entries
3163
+ * const mm = new TreeMultiMap<number, string>();
3164
+ * mm.add(1, 'a');
3165
+ * mm.add(2, 'b');
3166
+ * const keys: number[] = [];
3167
+ * mm.forEach((v, k) => keys.push(k));
3168
+ * console.log(keys); // [1, 2];
628
3169
  */
629
3170
  forEach(callback: (value: V[], key: K, map: this) => void): void {
630
3171
  for (const [k, v] of this) {
@@ -635,6 +3176,157 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
635
3176
  /**
636
3177
  * Creates a new map with entries that pass the predicate.
637
3178
  * @remarks Time O(n), Space O(n)
3179
+
3180
+
3181
+
3182
+
3183
+
3184
+
3185
+
3186
+
3187
+
3188
+
3189
+
3190
+
3191
+
3192
+
3193
+
3194
+
3195
+
3196
+
3197
+
3198
+
3199
+
3200
+
3201
+
3202
+
3203
+
3204
+
3205
+
3206
+
3207
+
3208
+
3209
+
3210
+
3211
+
3212
+
3213
+
3214
+
3215
+
3216
+
3217
+
3218
+
3219
+
3220
+
3221
+
3222
+
3223
+
3224
+
3225
+
3226
+
3227
+
3228
+
3229
+
3230
+
3231
+
3232
+
3233
+
3234
+
3235
+
3236
+
3237
+
3238
+
3239
+
3240
+
3241
+
3242
+
3243
+
3244
+
3245
+
3246
+
3247
+
3248
+
3249
+
3250
+
3251
+
3252
+
3253
+
3254
+
3255
+
3256
+
3257
+
3258
+
3259
+
3260
+
3261
+
3262
+
3263
+
3264
+
3265
+
3266
+
3267
+
3268
+
3269
+
3270
+
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+
3278
+
3279
+
3280
+
3281
+
3282
+
3283
+
3284
+
3285
+
3286
+
3287
+
3288
+
3289
+
3290
+
3291
+
3292
+
3293
+
3294
+
3295
+
3296
+
3297
+
3298
+
3299
+
3300
+
3301
+
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+
3308
+
3309
+
3310
+
3311
+
3312
+
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+
3321
+
3322
+ * @example
3323
+ * // Filter entries
3324
+ * const mm = new TreeMultiMap<number, string>();
3325
+ * mm.add(1, 'a');
3326
+ * mm.add(2, 'b');
3327
+ * mm.add(3, 'c');
3328
+ * const filtered = mm.filter((v, k) => k > 1);
3329
+ * console.log([...filtered.keys()]); // [2, 3];
638
3330
  */
639
3331
  filter(predicate: (value: V[], key: K, map: this) => boolean): TreeMultiMap<K, V, R> {
640
3332
  const filtered: [K, V[]][] = [];
@@ -647,6 +3339,155 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
647
3339
  /**
648
3340
  * Creates a new map by transforming each entry.
649
3341
  * @remarks Time O(n log n), Space O(n)
3342
+
3343
+
3344
+
3345
+
3346
+
3347
+
3348
+
3349
+
3350
+
3351
+
3352
+
3353
+
3354
+
3355
+
3356
+
3357
+
3358
+
3359
+
3360
+
3361
+
3362
+
3363
+
3364
+
3365
+
3366
+
3367
+
3368
+
3369
+
3370
+
3371
+
3372
+
3373
+
3374
+
3375
+
3376
+
3377
+
3378
+
3379
+
3380
+
3381
+
3382
+
3383
+
3384
+
3385
+
3386
+
3387
+
3388
+
3389
+
3390
+
3391
+
3392
+
3393
+
3394
+
3395
+
3396
+
3397
+
3398
+
3399
+
3400
+
3401
+
3402
+
3403
+
3404
+
3405
+
3406
+
3407
+
3408
+
3409
+
3410
+
3411
+
3412
+
3413
+
3414
+
3415
+
3416
+
3417
+
3418
+
3419
+
3420
+
3421
+
3422
+
3423
+
3424
+
3425
+
3426
+
3427
+
3428
+
3429
+
3430
+
3431
+
3432
+
3433
+
3434
+
3435
+
3436
+
3437
+
3438
+
3439
+
3440
+
3441
+
3442
+
3443
+
3444
+
3445
+
3446
+
3447
+
3448
+
3449
+
3450
+
3451
+
3452
+
3453
+
3454
+
3455
+
3456
+
3457
+
3458
+
3459
+
3460
+
3461
+
3462
+
3463
+
3464
+
3465
+
3466
+
3467
+
3468
+
3469
+
3470
+
3471
+
3472
+
3473
+
3474
+
3475
+
3476
+
3477
+
3478
+
3479
+
3480
+
3481
+
3482
+
3483
+
3484
+
3485
+ * @example
3486
+ * // Transform values
3487
+ * const mm = new TreeMultiMap<number, string>();
3488
+ * mm.add(1, 'a');
3489
+ * const mapped = mm.map((v, k) => [k, v.map(s => s.toUpperCase())] as [number, string[]]);
3490
+ * console.log(mapped.get(1)); // ['A'];
650
3491
  */
651
3492
  map<V2>(
652
3493
  mapper: (value: V[], key: K, map: this) => [K, V2[]]
@@ -661,6 +3502,156 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
661
3502
  /**
662
3503
  * Reduces all entries to a single value.
663
3504
  * @remarks Time O(n), Space O(1)
3505
+
3506
+
3507
+
3508
+
3509
+
3510
+
3511
+
3512
+
3513
+
3514
+
3515
+
3516
+
3517
+
3518
+
3519
+
3520
+
3521
+
3522
+
3523
+
3524
+
3525
+
3526
+
3527
+
3528
+
3529
+
3530
+
3531
+
3532
+
3533
+
3534
+
3535
+
3536
+
3537
+
3538
+
3539
+
3540
+
3541
+
3542
+
3543
+
3544
+
3545
+
3546
+
3547
+
3548
+
3549
+
3550
+
3551
+
3552
+
3553
+
3554
+
3555
+
3556
+
3557
+
3558
+
3559
+
3560
+
3561
+
3562
+
3563
+
3564
+
3565
+
3566
+
3567
+
3568
+
3569
+
3570
+
3571
+
3572
+
3573
+
3574
+
3575
+
3576
+
3577
+
3578
+
3579
+
3580
+
3581
+
3582
+
3583
+
3584
+
3585
+
3586
+
3587
+
3588
+
3589
+
3590
+
3591
+
3592
+
3593
+
3594
+
3595
+
3596
+
3597
+
3598
+
3599
+
3600
+
3601
+
3602
+
3603
+
3604
+
3605
+
3606
+
3607
+
3608
+
3609
+
3610
+
3611
+
3612
+
3613
+
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+
3624
+
3625
+
3626
+
3627
+
3628
+
3629
+
3630
+
3631
+
3632
+
3633
+
3634
+
3635
+
3636
+
3637
+
3638
+
3639
+
3640
+
3641
+
3642
+
3643
+
3644
+
3645
+
3646
+
3647
+
3648
+ * @example
3649
+ * // Aggregate
3650
+ * const mm = new TreeMultiMap<number, number>();
3651
+ * mm.add(1, 10);
3652
+ * mm.add(2, 20);
3653
+ * const sum = mm.reduce((acc, v) => acc + v.reduce((a, b) => a + b, 0), 0);
3654
+ * console.log(sum); // 30;
664
3655
  */
665
3656
  reduce<U>(callback: (accumulator: U, value: V[], key: K, map: this) => U, initialValue: U): U {
666
3657
  let acc = initialValue;
@@ -673,6 +3664,146 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
673
3664
  /**
674
3665
  * Sets multiple entries at once.
675
3666
  * @remarks Time O(m log n), Space O(m) where m is input size
3667
+
3668
+
3669
+
3670
+
3671
+
3672
+
3673
+
3674
+
3675
+
3676
+
3677
+
3678
+
3679
+
3680
+
3681
+
3682
+
3683
+
3684
+
3685
+
3686
+
3687
+
3688
+
3689
+
3690
+
3691
+
3692
+
3693
+
3694
+
3695
+
3696
+
3697
+
3698
+
3699
+
3700
+
3701
+
3702
+
3703
+
3704
+
3705
+
3706
+
3707
+
3708
+
3709
+
3710
+
3711
+
3712
+
3713
+
3714
+
3715
+
3716
+
3717
+
3718
+
3719
+
3720
+
3721
+
3722
+
3723
+
3724
+
3725
+
3726
+
3727
+
3728
+
3729
+
3730
+
3731
+
3732
+
3733
+
3734
+
3735
+
3736
+
3737
+
3738
+
3739
+
3740
+
3741
+
3742
+
3743
+
3744
+
3745
+
3746
+
3747
+
3748
+
3749
+
3750
+
3751
+
3752
+
3753
+
3754
+
3755
+
3756
+
3757
+
3758
+
3759
+
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+
3770
+
3771
+
3772
+
3773
+
3774
+
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
+ * @example
3803
+ * // Set multiple entries
3804
+ * const mm = new TreeMultiMap<number, string>();
3805
+ * mm.setMany([[1, ['a']], [2, ['b']]]);
3806
+ * console.log(mm.size); // 2;
676
3807
  */
677
3808
  setMany(keysNodesEntriesOrRaws: Iterable<K | [K | null | undefined, V[] | undefined]>): boolean[] {
678
3809
  const results: boolean[] = [];
@@ -686,6 +3817,128 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
686
3817
  /**
687
3818
  * Searches for entries within a key range.
688
3819
  * @remarks Time O(log n + k), Space O(k) where k is result size
3820
+
3821
+
3822
+
3823
+
3824
+
3825
+
3826
+
3827
+
3828
+
3829
+
3830
+
3831
+
3832
+
3833
+
3834
+
3835
+
3836
+
3837
+
3838
+
3839
+
3840
+
3841
+
3842
+
3843
+
3844
+
3845
+
3846
+
3847
+
3848
+
3849
+
3850
+
3851
+
3852
+
3853
+
3854
+
3855
+
3856
+
3857
+
3858
+
3859
+
3860
+
3861
+
3862
+
3863
+
3864
+
3865
+
3866
+
3867
+
3868
+
3869
+
3870
+
3871
+
3872
+
3873
+
3874
+
3875
+
3876
+
3877
+
3878
+
3879
+
3880
+
3881
+
3882
+
3883
+
3884
+
3885
+
3886
+
3887
+
3888
+
3889
+
3890
+
3891
+
3892
+
3893
+
3894
+
3895
+
3896
+
3897
+
3898
+
3899
+
3900
+
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
+ * @example
3935
+ * // Find keys in range
3936
+ * const mm = new TreeMultiMap<number, string>();
3937
+ * mm.add(10, 'a');
3938
+ * mm.add(20, 'b');
3939
+ * mm.add(30, 'c');
3940
+ * const result = mm.rangeSearch([15, 25]);
3941
+ * console.log(result.length); // 1;
689
3942
  */
690
3943
  rangeSearch<C extends (node: RedBlackTreeNode<K, V[]>) => unknown>(
691
3944
  range: Range<K> | [K, K],
@@ -697,6 +3950,156 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
697
3950
  /**
698
3951
  * Creates a shallow clone of this map.
699
3952
  * @remarks Time O(n log n), Space O(n)
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
+
4023
+
4024
+
4025
+
4026
+
4027
+
4028
+
4029
+
4030
+
4031
+
4032
+
4033
+
4034
+
4035
+
4036
+
4037
+
4038
+
4039
+
4040
+
4041
+
4042
+
4043
+
4044
+
4045
+
4046
+
4047
+
4048
+
4049
+
4050
+
4051
+
4052
+
4053
+
4054
+
4055
+
4056
+
4057
+
4058
+
4059
+
4060
+
4061
+
4062
+
4063
+
4064
+
4065
+
4066
+
4067
+
4068
+
4069
+
4070
+
4071
+
4072
+
4073
+
4074
+
4075
+
4076
+
4077
+
4078
+
4079
+
4080
+
4081
+
4082
+
4083
+
4084
+
4085
+
4086
+
4087
+
4088
+
4089
+
4090
+
4091
+
4092
+
4093
+
4094
+
4095
+
4096
+ * @example
4097
+ * // Deep clone
4098
+ * const mm = new TreeMultiMap<number, string>();
4099
+ * mm.add(1, 'a');
4100
+ * const copy = mm.clone();
4101
+ * copy.delete(1);
4102
+ * console.log(mm.has(1)); // true;
700
4103
  */
701
4104
  clone(): TreeMultiMap<K, V, R> {
702
4105
  return new TreeMultiMap<K, V, R>(this, { comparator: this.comparator, isMapMode: this.#core.isMapMode });