data-structure-typed 2.5.3 → 2.6.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 (158) hide show
  1. package/.github/workflows/ci.yml +7 -2
  2. package/.github/workflows/release-package.yml +9 -2
  3. package/.husky/pre-commit +3 -0
  4. package/CHANGELOG.md +1 -1
  5. package/MIGRATION.md +48 -0
  6. package/README.md +20 -2
  7. package/README_CN.md +20 -2
  8. package/SPECIFICATION.md +24 -0
  9. package/SPECIFICATION.zh-CN.md +24 -0
  10. package/dist/cjs/binary-tree.cjs +1897 -19
  11. package/dist/cjs/graph.cjs +174 -0
  12. package/dist/cjs/hash.cjs +33 -0
  13. package/dist/cjs/heap.cjs +71 -0
  14. package/dist/cjs/index.cjs +2383 -3
  15. package/dist/cjs/linked-list.cjs +224 -2
  16. package/dist/cjs/matrix.cjs +24 -0
  17. package/dist/cjs/priority-queue.cjs +71 -0
  18. package/dist/cjs/queue.cjs +221 -1
  19. package/dist/cjs/stack.cjs +59 -0
  20. package/dist/cjs/trie.cjs +62 -0
  21. package/dist/cjs-legacy/binary-tree.cjs +1897 -19
  22. package/dist/cjs-legacy/graph.cjs +174 -0
  23. package/dist/cjs-legacy/hash.cjs +33 -0
  24. package/dist/cjs-legacy/heap.cjs +71 -0
  25. package/dist/cjs-legacy/index.cjs +2383 -3
  26. package/dist/cjs-legacy/linked-list.cjs +224 -2
  27. package/dist/cjs-legacy/matrix.cjs +24 -0
  28. package/dist/cjs-legacy/priority-queue.cjs +71 -0
  29. package/dist/cjs-legacy/queue.cjs +221 -1
  30. package/dist/cjs-legacy/stack.cjs +59 -0
  31. package/dist/cjs-legacy/trie.cjs +62 -0
  32. package/dist/esm/binary-tree.mjs +1897 -19
  33. package/dist/esm/graph.mjs +174 -0
  34. package/dist/esm/hash.mjs +33 -0
  35. package/dist/esm/heap.mjs +71 -0
  36. package/dist/esm/index.mjs +2383 -3
  37. package/dist/esm/linked-list.mjs +224 -2
  38. package/dist/esm/matrix.mjs +24 -0
  39. package/dist/esm/priority-queue.mjs +71 -0
  40. package/dist/esm/queue.mjs +221 -1
  41. package/dist/esm/stack.mjs +59 -0
  42. package/dist/esm/trie.mjs +62 -0
  43. package/dist/esm-legacy/binary-tree.mjs +1897 -19
  44. package/dist/esm-legacy/graph.mjs +174 -0
  45. package/dist/esm-legacy/hash.mjs +33 -0
  46. package/dist/esm-legacy/heap.mjs +71 -0
  47. package/dist/esm-legacy/index.mjs +2383 -3
  48. package/dist/esm-legacy/linked-list.mjs +224 -2
  49. package/dist/esm-legacy/matrix.mjs +24 -0
  50. package/dist/esm-legacy/priority-queue.mjs +71 -0
  51. package/dist/esm-legacy/queue.mjs +221 -1
  52. package/dist/esm-legacy/stack.mjs +59 -0
  53. package/dist/esm-legacy/trie.mjs +62 -0
  54. package/dist/types/data-structures/base/iterable-element-base.d.ts +17 -0
  55. package/dist/types/data-structures/base/linear-base.d.ts +6 -0
  56. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +36 -0
  57. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +42 -0
  58. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +75 -0
  59. package/dist/types/data-structures/binary-tree/bst.d.ts +72 -0
  60. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +57 -0
  61. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +18 -0
  62. package/dist/types/data-structures/binary-tree/tree-map.d.ts +375 -0
  63. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +389 -0
  64. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +330 -0
  65. package/dist/types/data-structures/binary-tree/tree-set.d.ts +438 -0
  66. package/dist/types/data-structures/graph/directed-graph.d.ts +30 -0
  67. package/dist/types/data-structures/graph/undirected-graph.d.ts +27 -0
  68. package/dist/types/data-structures/hash/hash-map.d.ts +33 -0
  69. package/dist/types/data-structures/heap/heap.d.ts +42 -0
  70. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +75 -2
  71. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +45 -0
  72. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +54 -0
  73. package/dist/types/data-structures/matrix/matrix.d.ts +24 -0
  74. package/dist/types/data-structures/queue/deque.d.ts +90 -1
  75. package/dist/types/data-structures/queue/queue.d.ts +36 -0
  76. package/dist/types/data-structures/stack/stack.d.ts +30 -0
  77. package/dist/types/data-structures/trie/trie.d.ts +36 -0
  78. package/dist/umd/data-structure-typed.js +2383 -3
  79. package/dist/umd/data-structure-typed.min.js +3 -3
  80. package/docs-site-docusaurus/docs/api/classes/AVLTree.md +108 -108
  81. package/docs-site-docusaurus/docs/api/classes/BST.md +101 -101
  82. package/docs-site-docusaurus/docs/api/classes/BinaryIndexedTree.md +13 -13
  83. package/docs-site-docusaurus/docs/api/classes/BinaryTree.md +66 -66
  84. package/docs-site-docusaurus/docs/api/classes/Deque.md +235 -51
  85. package/docs-site-docusaurus/docs/api/classes/DirectedGraph.md +21 -21
  86. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedList.md +231 -67
  87. package/docs-site-docusaurus/docs/api/classes/FibonacciHeap.md +9 -9
  88. package/docs-site-docusaurus/docs/api/classes/FibonacciHeapNode.md +1 -1
  89. package/docs-site-docusaurus/docs/api/classes/HashMap.md +14 -14
  90. package/docs-site-docusaurus/docs/api/classes/Heap.md +117 -34
  91. package/docs-site-docusaurus/docs/api/classes/IterableElementBase.md +83 -13
  92. package/docs-site-docusaurus/docs/api/classes/LinearBase.md +124 -20
  93. package/docs-site-docusaurus/docs/api/classes/LinearLinkedBase.md +140 -32
  94. package/docs-site-docusaurus/docs/api/classes/LinkedHashMap.md +30 -26
  95. package/docs-site-docusaurus/docs/api/classes/LinkedListQueue.md +159 -51
  96. package/docs-site-docusaurus/docs/api/classes/MapGraph.md +20 -20
  97. package/docs-site-docusaurus/docs/api/classes/Matrix.md +23 -23
  98. package/docs-site-docusaurus/docs/api/classes/MaxHeap.md +117 -34
  99. package/docs-site-docusaurus/docs/api/classes/MaxPriorityQueue.md +117 -34
  100. package/docs-site-docusaurus/docs/api/classes/MinHeap.md +117 -34
  101. package/docs-site-docusaurus/docs/api/classes/MinPriorityQueue.md +117 -34
  102. package/docs-site-docusaurus/docs/api/classes/PriorityQueue.md +117 -34
  103. package/docs-site-docusaurus/docs/api/classes/Queue.md +142 -34
  104. package/docs-site-docusaurus/docs/api/classes/RedBlackTree.md +117 -117
  105. package/docs-site-docusaurus/docs/api/classes/SegmentTree.md +8 -8
  106. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedList.md +158 -50
  107. package/docs-site-docusaurus/docs/api/classes/SkipList.md +21 -21
  108. package/docs-site-docusaurus/docs/api/classes/Stack.md +108 -26
  109. package/docs-site-docusaurus/docs/api/classes/TreeMap.md +33 -33
  110. package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +75 -39
  111. package/docs-site-docusaurus/docs/api/classes/TreeSet.md +301 -39
  112. package/docs-site-docusaurus/docs/api/classes/Trie.md +110 -28
  113. package/docs-site-docusaurus/docs/api/classes/UndirectedGraph.md +20 -20
  114. package/jest.integration.config.js +1 -2
  115. package/package.json +51 -50
  116. package/src/common/error.ts +15 -32
  117. package/src/common/index.ts +0 -3
  118. package/src/data-structures/base/iterable-element-base.ts +32 -3
  119. package/src/data-structures/base/linear-base.ts +13 -36
  120. package/src/data-structures/binary-tree/avl-tree.ts +31 -493
  121. package/src/data-structures/binary-tree/binary-indexed-tree.ts +47 -530
  122. package/src/data-structures/binary-tree/binary-tree.ts +326 -1236
  123. package/src/data-structures/binary-tree/bst.ts +158 -1010
  124. package/src/data-structures/binary-tree/red-black-tree.ts +451 -1233
  125. package/src/data-structures/binary-tree/segment-tree.ts +73 -333
  126. package/src/data-structures/binary-tree/tree-map.ts +462 -4749
  127. package/src/data-structures/binary-tree/tree-multi-map.ts +310 -4530
  128. package/src/data-structures/binary-tree/tree-multi-set.ts +300 -3652
  129. package/src/data-structures/binary-tree/tree-set.ts +437 -4443
  130. package/src/data-structures/graph/abstract-graph.ts +98 -167
  131. package/src/data-structures/graph/directed-graph.ts +137 -532
  132. package/src/data-structures/graph/map-graph.ts +0 -3
  133. package/src/data-structures/graph/undirected-graph.ts +132 -484
  134. package/src/data-structures/hash/hash-map.ts +154 -549
  135. package/src/data-structures/heap/heap.ts +200 -753
  136. package/src/data-structures/linked-list/doubly-linked-list.ts +153 -809
  137. package/src/data-structures/linked-list/singly-linked-list.ts +122 -749
  138. package/src/data-structures/linked-list/skip-linked-list.ts +211 -864
  139. package/src/data-structures/matrix/matrix.ts +179 -494
  140. package/src/data-structures/matrix/navigator.ts +0 -1
  141. package/src/data-structures/priority-queue/max-priority-queue.ts +1 -6
  142. package/src/data-structures/priority-queue/min-priority-queue.ts +6 -11
  143. package/src/data-structures/priority-queue/priority-queue.ts +1 -2
  144. package/src/data-structures/queue/deque.ts +241 -807
  145. package/src/data-structures/queue/queue.ts +102 -589
  146. package/src/data-structures/stack/stack.ts +76 -475
  147. package/src/data-structures/trie/trie.ts +98 -592
  148. package/src/types/common.ts +0 -10
  149. package/src/types/data-structures/binary-tree/bst.ts +0 -7
  150. package/src/types/data-structures/binary-tree/red-black-tree.ts +0 -1
  151. package/src/types/data-structures/graph/abstract-graph.ts +0 -2
  152. package/src/types/data-structures/hash/hash-map.ts +0 -3
  153. package/src/types/data-structures/hash/index.ts +0 -1
  154. package/src/types/data-structures/matrix/navigator.ts +0 -2
  155. package/src/types/utils/utils.ts +0 -7
  156. package/src/types/utils/validate-type.ts +0 -7
  157. package/src/utils/number.ts +0 -2
  158. package/src/utils/utils.ts +0 -5
@@ -5,7 +5,6 @@
5
5
  * @copyright Copyright (c) 2022 Pablo Zeng
6
6
  * @license MIT License
7
7
  */
8
-
9
8
  import type { Comparator, TreeMultiMapOptions } from '../../types';
10
9
  import { ERR, raise, Range } from '../../common';
11
10
  import { RedBlackTree, RedBlackTreeNode } from './red-black-tree';
@@ -49,23 +48,25 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
49
48
  const comparator = options.comparator ?? TreeSet.createDefaultComparator<K>();
50
49
  this.#isDefaultComparator = options.comparator === undefined;
51
50
  const toEntryFn = options.toEntryFn;
52
- this.#core = new RedBlackTree<K, V[], R>([], { ...options, comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
53
-
51
+ this.#core = new RedBlackTree<K, V[], R>([], {
52
+ ...options,
53
+ comparator,
54
+ isMapMode: options.isMapMode,
55
+ enableOrderStatistic: options.enableOrderStatistic
56
+ });
54
57
  for (const x of keysNodesEntriesOrRaws) {
55
58
  if (x === null || x === undefined) continue;
56
-
57
59
  // If toEntryFn is provided, use it to transform raw element
58
60
  if (toEntryFn) {
59
61
  const [k, bucket] = toEntryFn(x as R);
60
62
  if (k === null || k === undefined) continue;
61
63
  if (bucket !== undefined) {
62
- this.#core.set(k as K, Array.isArray(bucket) ? [...bucket] : [bucket] as V[]);
64
+ this.#core.set(k as K, Array.isArray(bucket) ? [...bucket] : ([bucket] as V[]));
63
65
  } else {
64
66
  this.#core.set(k as K, [] as V[]);
65
67
  }
66
68
  continue;
67
69
  }
68
-
69
70
  if (Array.isArray(x)) {
70
71
  const [k, bucket] = x;
71
72
  if (k === null || k === undefined) continue;
@@ -83,217 +84,44 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
83
84
  }
84
85
 
85
86
  /**
86
- * Validates the key against the default comparator rules.
87
+ * Number of distinct keys.
87
88
  * @remarks Time O(1), Space O(1)
88
89
  */
89
- private _validateKey(key: K): void {
90
- if (!this.#isDefaultComparator) return;
91
- // reuse TreeSet strict validation (same policy)
92
- // NOTE: TreeSet._validateKey is private, so we replicate the checks.
93
- if (typeof key === 'number') {
94
- if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeMultiMap'));
95
- return;
96
- }
97
- if (typeof key === 'string') return;
98
- if (key instanceof Date) {
99
- if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeMultiMap'));
100
- return;
101
- }
102
- raise(TypeError, ERR.comparatorRequired('TreeMultiMap'));
90
+ get size(): number {
91
+ return this.#core.size;
103
92
  }
104
93
 
105
94
  /**
106
- * Number of distinct keys.
95
+ * Total number of values across all buckets (Σ bucket.length).
96
+ * @remarks Time O(n), Space O(1)
97
+ * @example
98
+ * // Total number of values
99
+ * const mm = new TreeMultiMap<number, string>();
100
+ * mm.add(1, 'a');
101
+ * mm.add(1, 'b');
102
+ * mm.add(2, 'c');
103
+ * console.log(mm.totalSize); // 3;
104
+ */
105
+ get totalSize(): number {
106
+ let sum = 0;
107
+ for (const [, bucket] of this) sum += bucket.length;
108
+ return sum;
109
+ }
110
+
111
+ /**
112
+ * Expose comparator for advanced usage/testing (read-only).
107
113
  * @remarks Time O(1), Space O(1)
108
114
  */
109
- get size(): number {
110
- return this.#core.size;
115
+ get comparator(): Comparator<K> {
116
+ return this.#core.comparator;
111
117
  }
112
118
 
113
119
  /**
114
120
  * Whether the map is empty.
115
121
  * @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
-
260
-
261
-
262
-
263
-
264
-
265
-
266
-
267
-
268
-
269
-
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
- * @example
295
- * // Check if empty
296
- * console.log(new TreeMultiMap().isEmpty()); // true;
122
+ * @example
123
+ * // Check if empty
124
+ * console.log(new TreeMultiMap().isEmpty()); // true;
297
125
  */
298
126
  isEmpty(): boolean {
299
127
  return this.size === 0;
@@ -302,190 +130,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
302
130
  /**
303
131
  * Removes all entries from the map.
304
132
  * @remarks Time O(1), Space O(1)
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
-
447
-
448
-
449
-
450
-
451
-
452
-
453
-
454
-
455
-
456
-
457
-
458
-
459
-
460
-
461
-
462
-
463
-
464
-
465
-
466
-
467
-
468
-
469
-
470
-
471
-
472
-
473
-
474
-
475
-
476
-
477
-
478
-
479
-
480
-
481
-
482
-
483
- * @example
484
- * // Remove all entries
485
- * const mm = new TreeMultiMap<number, string>();
486
- * mm.add(1, 'a');
487
- * mm.clear();
488
- * console.log(mm.isEmpty()); // true;
133
+ * @example
134
+ * // Remove all entries
135
+ * const mm = new TreeMultiMap<number, string>();
136
+ * mm.add(1, 'a');
137
+ * mm.clear();
138
+ * console.log(mm.isEmpty()); // true;
489
139
  */
490
140
  clear(): void {
491
141
  this.#core.clear();
@@ -494,324 +144,27 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
494
144
  /**
495
145
  * Bucket length for a key (missing => 0).
496
146
  * @remarks Time O(log n), Space O(1)
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
- * @example
528
- * // Count values for key
529
- * const mm = new TreeMultiMap<number, string>();
530
- * mm.add(1, 'a');
531
- * mm.add(1, 'b');
532
- * console.log(mm.count(1)); // 2;
147
+ * @example
148
+ * // Count values for key
149
+ * const mm = new TreeMultiMap<number, string>();
150
+ * mm.add(1, 'a');
151
+ * mm.add(1, 'b');
152
+ * console.log(mm.count(1)); // 2;
533
153
  */
534
154
  count(key: K): number {
535
155
  const b = this.get(key);
536
156
  return Array.isArray(b) ? b.length : 0;
537
157
  }
538
158
 
539
- /**
540
- * Total number of values across all buckets (Σ bucket.length).
541
- * @remarks Time O(n), Space O(1)
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
- * @example
573
- * // Total number of values
574
- * const mm = new TreeMultiMap<number, string>();
575
- * mm.add(1, 'a');
576
- * mm.add(1, 'b');
577
- * mm.add(2, 'c');
578
- * console.log(mm.totalSize); // 3;
579
- */
580
- get totalSize(): number {
581
- let sum = 0;
582
- for (const [, bucket] of this) sum += bucket.length;
583
- return sum;
584
- }
585
-
586
159
  /**
587
160
  * Whether the map contains the given key.
588
161
  * @remarks Time O(log n), Space O(1)
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
-
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
-
805
-
806
-
807
-
808
-
809
- * @example
810
- * // Check key existence
811
- * const mm = new TreeMultiMap<number, string>();
812
- * mm.add(1, 'a');
813
- * console.log(mm.has(1)); // true;
814
- * console.log(mm.has(2)); // false;
162
+ * @example
163
+ * // Check key existence
164
+ * const mm = new TreeMultiMap<number, string>();
165
+ * mm.add(1, 'a');
166
+ * console.log(mm.has(1)); // true;
167
+ * console.log(mm.has(2)); // false;
815
168
  */
816
169
  has(key: K): boolean {
817
170
  this._validateKey(key);
@@ -821,232 +174,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
821
174
  /**
822
175
  * Live bucket reference (do not auto-delete key if bucket becomes empty via mutation).
823
176
  * @remarks Time O(log n), Space O(1)
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
-
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
-
1029
-
1030
-
1031
-
1032
-
1033
-
1034
-
1035
-
1036
-
1037
-
1038
-
1039
-
1040
-
1041
-
1042
-
1043
-
1044
- * @example
1045
- * // Get values for key
1046
- * const mm = new TreeMultiMap<number, string>();
1047
- * mm.add(1, 'a');
1048
- * mm.add(1, 'b');
1049
- * console.log(mm.get(1)); // ['a', 'b'];
177
+ * @example
178
+ * // Get values for key
179
+ * const mm = new TreeMultiMap<number, string>();
180
+ * mm.add(1, 'a');
181
+ * mm.add(1, 'b');
182
+ * console.log(mm.get(1)); // ['a', 'b'];
1050
183
  */
1051
184
  get(key: K): V[] | undefined {
1052
185
  this._validateKey(key);
@@ -1056,185 +189,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1056
189
  /**
1057
190
  * Append a single value.
1058
191
  * @remarks Time O(log n), Space O(1)
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
-
1226
-
1227
-
1228
-
1229
-
1230
-
1231
- * @example
1232
- * // Add key-value pair
1233
- * const mm = new TreeMultiMap<number, string>();
1234
- * mm.add(1, 'a');
1235
- * mm.add(1, 'b');
1236
- * mm.add(2, 'c');
1237
- * console.log(mm.get(1)); // ['a', 'b'];
192
+ * @example
193
+ * // Add key-value pair
194
+ * const mm = new TreeMultiMap<number, string>();
195
+ * mm.add(1, 'a');
196
+ * mm.add(1, 'b');
197
+ * mm.add(2, 'c');
198
+ * console.log(mm.get(1)); // ['a', 'b'];
1238
199
  */
1239
200
  add(key: K, value: V): boolean {
1240
201
  this._validateKey(key);
@@ -1249,230 +210,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1249
210
  /**
1250
211
  * Alias for compatibility with existing TreeMultiMap semantics.
1251
212
  * @remarks Time O(log n), Space O(1) for single value; O(log n + m) for bucket append
1252
-
1253
-
1254
-
1255
-
1256
-
1257
-
1258
-
1259
-
1260
-
1261
-
1262
-
1263
-
1264
-
1265
-
1266
-
1267
-
1268
-
1269
-
1270
-
1271
-
1272
-
1273
-
1274
-
1275
-
1276
-
1277
-
1278
-
1279
-
1280
-
1281
-
1282
-
1283
-
1284
-
1285
-
1286
-
1287
-
1288
-
1289
-
1290
-
1291
-
1292
-
1293
-
1294
-
1295
-
1296
-
1297
-
1298
-
1299
-
1300
-
1301
-
1302
-
1303
-
1304
-
1305
-
1306
-
1307
-
1308
-
1309
-
1310
-
1311
-
1312
-
1313
-
1314
-
1315
-
1316
-
1317
-
1318
-
1319
-
1320
-
1321
-
1322
-
1323
-
1324
-
1325
-
1326
-
1327
-
1328
-
1329
-
1330
-
1331
-
1332
-
1333
-
1334
-
1335
-
1336
-
1337
-
1338
-
1339
-
1340
-
1341
-
1342
-
1343
-
1344
-
1345
-
1346
-
1347
-
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
-
1460
-
1461
-
1462
-
1463
-
1464
-
1465
-
1466
-
1467
-
1468
-
1469
-
1470
- * @example
1471
- * // Set values for key
1472
- * const mm = new TreeMultiMap<number, string>();
1473
- * mm.set(1, 'a');
1474
- * mm.set(1, 'b');
1475
- * console.log(mm.get(1)); // ['a', 'b'];
213
+ * @example
214
+ * // Set values for key
215
+ * const mm = new TreeMultiMap<number, string>();
216
+ * mm.set(1, 'a');
217
+ * mm.set(1, 'b');
218
+ * console.log(mm.get(1)); // ['a', 'b'];
1476
219
  */
1477
220
  set(entry: [K | null | undefined, V[] | undefined] | K | null | undefined, value?: V): boolean;
1478
221
  set(key: K, value: V): boolean;
@@ -1502,233 +245,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1502
245
  /**
1503
246
  * Deletes a key and its entire bucket.
1504
247
  * @remarks Time O(log n), Space O(1)
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
-
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
- * @example
1726
- * // Remove key
1727
- * const mm = new TreeMultiMap<number, string>();
1728
- * mm.add(1, 'a');
1729
- * mm.add(2, 'b');
1730
- * mm.delete(1);
1731
- * console.log(mm.has(1)); // false;
248
+ * @example
249
+ * // Remove key
250
+ * const mm = new TreeMultiMap<number, string>();
251
+ * mm.add(1, 'a');
252
+ * mm.add(2, 'b');
253
+ * mm.delete(1);
254
+ * console.log(mm.has(1)); // false;
1732
255
  */
1733
256
  delete(key: K): boolean {
1734
257
  this._validateKey(key);
@@ -1738,42 +261,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1738
261
  /**
1739
262
  * Check if a specific value exists in a key's bucket.
1740
263
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
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
- * @example
1772
- * // Check specific key-value
1773
- * const mm = new TreeMultiMap<number, string>();
1774
- * mm.add(1, 'a');
1775
- * console.log(mm.hasEntry(1, 'a')); // true;
1776
- * console.log(mm.hasEntry(1, 'z')); // false;
264
+ * @example
265
+ * // Check specific key-value
266
+ * const mm = new TreeMultiMap<number, string>();
267
+ * mm.add(1, 'a');
268
+ * console.log(mm.hasEntry(1, 'a')); // true;
269
+ * console.log(mm.hasEntry(1, 'z')); // false;
1777
270
  */
1778
271
  hasEntry(key: K, value: V, eq: (a: V, b: V) => boolean = Object.is): boolean {
1779
272
  const bucket = this.get(key);
@@ -1784,43 +277,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1784
277
  /**
1785
278
  * Delete a single occurrence of a value from a key's bucket.
1786
279
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
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
- * @example
1818
- * // Delete specific value
1819
- * const mm = new TreeMultiMap<number, string>();
1820
- * mm.add(1, 'a');
1821
- * mm.add(1, 'b');
1822
- * mm.deleteValue(1, 'a');
1823
- * console.log(mm.get(1)); // ['b'];
280
+ * @example
281
+ * // Delete specific value
282
+ * const mm = new TreeMultiMap<number, string>();
283
+ * mm.add(1, 'a');
284
+ * mm.add(1, 'b');
285
+ * mm.deleteValue(1, 'a');
286
+ * console.log(mm.get(1)); // ['b'];
1824
287
  */
1825
288
  deleteValue(key: K, value: V, eq: (a: V, b: V) => boolean = Object.is): boolean {
1826
289
  const bucket = this.get(key);
@@ -1835,44 +298,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1835
298
  /**
1836
299
  * Delete all occurrences of a value from a key's bucket.
1837
300
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
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
- * @example
1869
- * // Delete all matching values
1870
- * const mm = new TreeMultiMap<number, string>();
1871
- * mm.add(1, 'a');
1872
- * mm.add(1, 'a');
1873
- * mm.add(1, 'b');
1874
- * const count = mm.deleteValues(1, 'a');
1875
- * console.log(count); // 2;
301
+ * @example
302
+ * // Delete all matching values
303
+ * const mm = new TreeMultiMap<number, string>();
304
+ * mm.add(1, 'a');
305
+ * mm.add(1, 'a');
306
+ * mm.add(1, 'b');
307
+ * const count = mm.deleteValues(1, 'a');
308
+ * console.log(count); // 2;
1876
309
  */
1877
310
  deleteValues(key: K, value: V, eq: (a: V, b: V) => boolean = Object.is): number {
1878
311
  const bucket = this.get(key);
@@ -1904,190 +337,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
1904
337
  /**
1905
338
  * Iterates over all keys.
1906
339
  * @remarks Time O(n), Space O(1)
1907
-
1908
-
1909
-
1910
-
1911
-
1912
-
1913
-
1914
-
1915
-
1916
-
1917
-
1918
-
1919
-
1920
-
1921
-
1922
-
1923
-
1924
-
1925
-
1926
-
1927
-
1928
-
1929
-
1930
-
1931
-
1932
-
1933
-
1934
-
1935
-
1936
-
1937
-
1938
-
1939
-
1940
-
1941
-
1942
-
1943
-
1944
-
1945
-
1946
-
1947
-
1948
-
1949
-
1950
-
1951
-
1952
-
1953
-
1954
-
1955
-
1956
-
1957
-
1958
-
1959
-
1960
-
1961
-
1962
-
1963
-
1964
-
1965
-
1966
-
1967
-
1968
-
1969
-
1970
-
1971
-
1972
-
1973
-
1974
-
1975
-
1976
-
1977
-
1978
-
1979
-
1980
-
1981
-
1982
-
1983
-
1984
-
1985
-
1986
-
1987
-
1988
-
1989
-
1990
-
1991
-
1992
-
1993
-
1994
-
1995
-
1996
-
1997
-
1998
-
1999
-
2000
-
2001
-
2002
-
2003
-
2004
-
2005
-
2006
-
2007
-
2008
-
2009
-
2010
-
2011
-
2012
-
2013
-
2014
-
2015
-
2016
-
2017
-
2018
-
2019
-
2020
-
2021
-
2022
-
2023
-
2024
-
2025
-
2026
-
2027
-
2028
-
2029
-
2030
-
2031
-
2032
-
2033
-
2034
-
2035
-
2036
-
2037
-
2038
-
2039
-
2040
-
2041
-
2042
-
2043
-
2044
-
2045
-
2046
-
2047
-
2048
-
2049
-
2050
-
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
- * @example
2086
- * // Iterate keys
2087
- * const mm = new TreeMultiMap<number, string>();
2088
- * mm.add(3, 'c');
2089
- * mm.add(1, 'a');
2090
- * console.log([...mm.keys()]); // [1, 3];
340
+ * @example
341
+ * // Iterate keys
342
+ * const mm = new TreeMultiMap<number, string>();
343
+ * mm.add(3, 'c');
344
+ * mm.add(1, 'a');
345
+ * console.log([...mm.keys()]); // [1, 3];
2091
346
  */
2092
347
  *keys(): IterableIterator<K> {
2093
348
  yield* this.#core.keys();
@@ -2096,236 +351,49 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2096
351
  /**
2097
352
  * Iterates over all buckets.
2098
353
  * @remarks Time O(n), Space O(1)
2099
-
2100
-
2101
-
2102
-
2103
-
2104
-
2105
-
2106
-
2107
-
2108
-
2109
-
2110
-
2111
-
2112
-
2113
-
2114
-
2115
-
2116
-
2117
-
2118
-
2119
-
2120
-
2121
-
2122
-
2123
-
2124
-
2125
-
2126
-
2127
-
2128
-
2129
-
2130
-
2131
-
2132
-
2133
-
2134
-
2135
-
2136
-
2137
-
2138
-
2139
-
2140
-
2141
-
2142
-
2143
-
2144
-
2145
-
2146
-
2147
-
2148
-
2149
-
2150
-
2151
-
2152
-
2153
-
2154
-
2155
-
2156
-
2157
-
2158
-
2159
-
2160
-
2161
-
2162
-
2163
-
2164
-
2165
-
2166
-
2167
-
2168
-
2169
-
2170
-
2171
-
2172
-
2173
-
2174
-
2175
-
2176
-
2177
-
2178
-
2179
-
2180
-
2181
-
2182
-
2183
-
2184
-
2185
-
2186
-
2187
-
2188
-
2189
-
2190
-
2191
-
2192
-
2193
-
2194
-
2195
-
2196
-
2197
-
2198
-
2199
-
2200
-
2201
-
2202
-
2203
-
2204
-
2205
-
2206
-
2207
-
2208
-
2209
-
2210
-
2211
-
2212
-
2213
-
2214
-
2215
-
2216
-
2217
-
2218
-
2219
-
2220
-
2221
-
2222
-
2223
-
2224
-
2225
-
2226
-
2227
-
2228
-
2229
-
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
-
2267
-
2268
-
2269
-
2270
-
2271
-
2272
-
2273
-
2274
-
2275
-
2276
-
2277
- * @example
2278
- * // Iterate value arrays
2279
- * const mm = new TreeMultiMap<number, string>();
2280
- * mm.add(1, 'a');
2281
- * mm.add(1, 'b');
2282
- * console.log([...mm.values()]); // [['a', 'b']];
354
+ * @example
355
+ * // Iterate value arrays
356
+ * const mm = new TreeMultiMap<number, string>();
357
+ * mm.add(1, 'a');
358
+ * mm.add(1, 'b');
359
+ * console.log([...mm.values()]); // [['a', 'b']];
2283
360
  */
2284
361
  *values(): IterableIterator<V[]> {
2285
362
  for (const [, bucket] of this) yield bucket;
2286
363
  }
2287
364
 
365
+ /**
366
+ * Iterate over all `[key, values[]]` entries (Map-compatible).
367
+ * @remarks Time O(n), Space O(1) per step.
368
+ * @example
369
+ * // Iterate over entries
370
+ * const mm = new TreeMultiMap<number, string>();
371
+ * mm.set(1, 'a');
372
+ * mm.set(1, 'b');
373
+ * mm.set(2, 'c');
374
+ * console.log([...mm.entries()]); // [
375
+ * // [1, ['a', 'b']],
376
+ * // [2, ['c']]
377
+ * // ];
378
+ */
379
+ *entries(): IterableIterator<[K, V[]]> {
380
+ yield* this;
381
+ }
382
+
2288
383
  // ---- entry-flat views ----
2289
384
 
2290
385
  /**
2291
386
  * Iterates over all entries for a specific key.
2292
387
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
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
- * @example
2324
- * // Get entries for key
2325
- * const mm = new TreeMultiMap<number, string>();
2326
- * mm.add(1, 'a');
2327
- * mm.add(1, 'b');
2328
- * console.log([...mm.entriesOf(1)]); // [[1, 'a'], [1, 'b']];
388
+ * @example
389
+ * // Get entries for key
390
+ * const mm = new TreeMultiMap<number, string>();
391
+ * mm.add(1, 'a');
392
+ * mm.add(1, 'b');
393
+ * console.log([...mm.entriesOf(1)]); // [
394
+ * // [1, 'a'],
395
+ * // [1, 'b']
396
+ * // ];
2329
397
  */
2330
398
  *entriesOf(key: K): IterableIterator<[K, V]> {
2331
399
  const bucket = this.get(key);
@@ -2336,42 +404,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2336
404
  /**
2337
405
  * Iterates over all values for a specific key.
2338
406
  * @remarks Time O(log n + m), Space O(1) where m is bucket size
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
- * @example
2370
- * // Get flat values for key
2371
- * const mm = new TreeMultiMap<number, string>();
2372
- * mm.add(1, 'a');
2373
- * mm.add(1, 'b');
2374
- * console.log([...mm.valuesOf(1)]); // ['a', 'b'];
407
+ * @example
408
+ * // Get flat values for key
409
+ * const mm = new TreeMultiMap<number, string>();
410
+ * mm.add(1, 'a');
411
+ * mm.add(1, 'b');
412
+ * console.log([...mm.valuesOf(1)]); // ['a', 'b'];
2375
413
  */
2376
414
  *valuesOf(key: K): IterableIterator<V> {
2377
415
  const bucket = this.get(key);
@@ -2382,43 +420,17 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2382
420
  /**
2383
421
  * Iterates over all [key, value] pairs (flattened from buckets).
2384
422
  * @remarks Time O(T), Space O(1) where T is totalSize
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
- * @example
2416
- * // All key-value pairs flattened
2417
- * const mm = new TreeMultiMap<number, string>();
2418
- * mm.add(1, 'a');
2419
- * mm.add(1, 'b');
2420
- * mm.add(2, 'c');
2421
- * console.log([...mm.flatEntries()]); // [[1, 'a'], [1, 'b'], [2, 'c']];
423
+ * @example
424
+ * // All key-value pairs flattened
425
+ * const mm = new TreeMultiMap<number, string>();
426
+ * mm.add(1, 'a');
427
+ * mm.add(1, 'b');
428
+ * mm.add(2, 'c');
429
+ * console.log([...mm.flatEntries()]); // [
430
+ * // [1, 'a'],
431
+ * // [1, 'b'],
432
+ * // [2, 'c']
433
+ * // ];
2422
434
  */
2423
435
  *flatEntries(): IterableIterator<[K, V]> {
2424
436
  for (const [k, bucket] of this) {
@@ -2431,82 +443,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2431
443
  /**
2432
444
  * Returns the entry with the smallest key.
2433
445
  * @remarks Time O(log n), Space O(1)
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
- * @example
2505
- * // First entry
2506
- * const mm = new TreeMultiMap<number, string>();
2507
- * mm.add(3, 'c');
2508
- * mm.add(1, 'a');
2509
- * console.log(mm.first()?.[0]); // 1;
446
+ * @example
447
+ * // First entry
448
+ * const mm = new TreeMultiMap<number, string>();
449
+ * mm.add(3, 'c');
450
+ * mm.add(1, 'a');
451
+ * console.log(mm.first()?.[0]); // 1;
2510
452
  */
2511
453
  first(): [K, V[]] | undefined {
2512
454
  const k = this.#core.getLeftMost();
@@ -2518,82 +460,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2518
460
  /**
2519
461
  * Returns the entry with the largest key.
2520
462
  * @remarks Time O(log n), Space O(1)
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
-
2583
-
2584
-
2585
-
2586
-
2587
-
2588
-
2589
-
2590
-
2591
- * @example
2592
- * // Last entry
2593
- * const mm = new TreeMultiMap<number, string>();
2594
- * mm.add(1, 'a');
2595
- * mm.add(3, 'c');
2596
- * console.log(mm.last()?.[0]); // 3;
463
+ * @example
464
+ * // Last entry
465
+ * const mm = new TreeMultiMap<number, string>();
466
+ * mm.add(1, 'a');
467
+ * mm.add(3, 'c');
468
+ * console.log(mm.last()?.[0]); // 3;
2597
469
  */
2598
470
  last(): [K, V[]] | undefined {
2599
471
  const k = this.#core.getRightMost();
@@ -2605,45 +477,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2605
477
  /**
2606
478
  * Removes and returns the entry with the smallest key.
2607
479
  * @remarks Time O(log n), Space O(1)
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
- * @example
2640
- * // Remove and return first
2641
- * const mm = new TreeMultiMap<number, string>();
2642
- * mm.add(2, 'b');
2643
- * mm.add(1, 'a');
2644
- * const first = mm.pollFirst();
2645
- * console.log(first?.[0]); // 1;
2646
- * console.log(mm.has(1)); // false;
480
+ * @example
481
+ * // Remove and return first
482
+ * const mm = new TreeMultiMap<number, string>();
483
+ * mm.add(2, 'b');
484
+ * mm.add(1, 'a');
485
+ * const first = mm.pollFirst();
486
+ * console.log(first?.[0]); // 1;
487
+ * console.log(mm.has(1)); // false;
2647
488
  */
2648
489
  pollFirst(): [K, V[]] | undefined {
2649
490
  const e = this.first();
@@ -2655,44 +496,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2655
496
  /**
2656
497
  * Removes and returns the entry with the largest key.
2657
498
  * @remarks Time O(log n), Space O(1)
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
- * @example
2690
- * // Remove and return last
2691
- * const mm = new TreeMultiMap<number, string>();
2692
- * mm.add(1, 'a');
2693
- * mm.add(3, 'c');
2694
- * const last = mm.pollLast();
2695
- * console.log(last?.[0]); // 3;
499
+ * @example
500
+ * // Remove and return last
501
+ * const mm = new TreeMultiMap<number, string>();
502
+ * mm.add(1, 'a');
503
+ * mm.add(3, 'c');
504
+ * const last = mm.pollLast();
505
+ * console.log(last?.[0]); // 3;
2696
506
  */
2697
507
  pollLast(): [K, V[]] | undefined {
2698
508
  const e = this.last();
@@ -2704,194 +514,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2704
514
  /**
2705
515
  * Returns the entry with the smallest key >= given key.
2706
516
  * @remarks Time O(log n), Space O(1)
2707
-
2708
-
2709
-
2710
-
2711
-
2712
-
2713
-
2714
-
2715
-
2716
-
2717
-
2718
-
2719
-
2720
-
2721
-
2722
-
2723
-
2724
-
2725
-
2726
-
2727
-
2728
-
2729
-
2730
-
2731
-
2732
-
2733
-
2734
-
2735
-
2736
-
2737
-
2738
-
2739
-
2740
-
2741
-
2742
-
2743
-
2744
-
2745
-
2746
-
2747
-
2748
-
2749
-
2750
-
2751
-
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
-
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
- * @example
2889
- * // Least key ≥ target
2890
- * const mm = new TreeMultiMap<number, string>();
2891
- * mm.add(10, 'a');
2892
- * mm.add(20, 'b');
2893
- * mm.add(30, 'c');
2894
- * console.log(mm.ceiling(15)?.[0]); // 20;
517
+ * @example
518
+ * // Least key ≥ target
519
+ * const mm = new TreeMultiMap<number, string>();
520
+ * mm.add(10, 'a');
521
+ * mm.add(20, 'b');
522
+ * mm.add(30, 'c');
523
+ * console.log(mm.ceiling(15)?.[0]); // 20;
2895
524
  */
2896
525
  ceiling(key: K): [K, V[]] | undefined {
2897
526
  this._validateKey(key);
@@ -2904,194 +533,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
2904
533
  /**
2905
534
  * Returns the entry with the largest key <= given key.
2906
535
  * @remarks Time O(log n), Space O(1)
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
-
3006
-
3007
-
3008
-
3009
-
3010
-
3011
-
3012
-
3013
-
3014
-
3015
-
3016
-
3017
-
3018
-
3019
-
3020
-
3021
-
3022
-
3023
-
3024
-
3025
-
3026
-
3027
-
3028
-
3029
-
3030
-
3031
-
3032
-
3033
-
3034
-
3035
-
3036
-
3037
-
3038
-
3039
-
3040
-
3041
-
3042
-
3043
-
3044
-
3045
-
3046
-
3047
-
3048
-
3049
-
3050
-
3051
-
3052
-
3053
-
3054
-
3055
-
3056
-
3057
-
3058
-
3059
-
3060
-
3061
-
3062
-
3063
-
3064
-
3065
-
3066
-
3067
-
3068
-
3069
-
3070
-
3071
-
3072
-
3073
-
3074
-
3075
-
3076
-
3077
-
3078
-
3079
-
3080
-
3081
-
3082
-
3083
-
3084
-
3085
-
3086
-
3087
-
3088
- * @example
3089
- * // Greatest key ≤ target
3090
- * const mm = new TreeMultiMap<number, string>();
3091
- * mm.add(10, 'a');
3092
- * mm.add(20, 'b');
3093
- * mm.add(30, 'c');
3094
- * console.log(mm.floor(25)?.[0]); // 20;
536
+ * @example
537
+ * // Greatest key ≤ target
538
+ * const mm = new TreeMultiMap<number, string>();
539
+ * mm.add(10, 'a');
540
+ * mm.add(20, 'b');
541
+ * mm.add(30, 'c');
542
+ * console.log(mm.floor(25)?.[0]); // 20;
3095
543
  */
3096
544
  floor(key: K): [K, V[]] | undefined {
3097
545
  this._validateKey(key);
@@ -3104,154 +552,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
3104
552
  /**
3105
553
  * Returns the entry with the smallest key > given key.
3106
554
  * @remarks Time O(log n), Space O(1)
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
-
3162
-
3163
-
3164
-
3165
-
3166
-
3167
-
3168
-
3169
-
3170
-
3171
-
3172
-
3173
-
3174
-
3175
-
3176
-
3177
-
3178
-
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
- * @example
3250
- * // Least key > target
3251
- * const mm = new TreeMultiMap<number, string>();
3252
- * mm.add(10, 'a');
3253
- * mm.add(20, 'b');
3254
- * console.log(mm.higher(10)?.[0]); // 20;
555
+ * @example
556
+ * // Least key > target
557
+ * const mm = new TreeMultiMap<number, string>();
558
+ * mm.add(10, 'a');
559
+ * mm.add(20, 'b');
560
+ * console.log(mm.higher(10)?.[0]); // 20;
3255
561
  */
3256
562
  higher(key: K): [K, V[]] | undefined {
3257
563
  this._validateKey(key);
@@ -3264,154 +570,12 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
3264
570
  /**
3265
571
  * Returns the entry with the largest key < given key.
3266
572
  * @remarks Time O(log n), Space O(1)
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
-
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
- * @example
3410
- * // Greatest key < target
3411
- * const mm = new TreeMultiMap<number, string>();
3412
- * mm.add(10, 'a');
3413
- * mm.add(20, 'b');
3414
- * console.log(mm.lower(20)?.[0]); // 10;
573
+ * @example
574
+ * // Greatest key < target
575
+ * const mm = new TreeMultiMap<number, string>();
576
+ * mm.add(10, 'a');
577
+ * mm.add(20, 'b');
578
+ * console.log(mm.lower(20)?.[0]); // 10;
3415
579
  */
3416
580
  lower(key: K): [K, V[]] | undefined {
3417
581
  this._validateKey(key);
@@ -3426,189 +590,11 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
3426
590
  /**
3427
591
  * Prints the internal tree structure (for debugging).
3428
592
  * @remarks Time O(n), Space O(n)
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
-
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
-
3584
-
3585
-
3586
-
3587
-
3588
-
3589
-
3590
-
3591
-
3592
-
3593
-
3594
-
3595
-
3596
-
3597
-
3598
-
3599
-
3600
-
3601
-
3602
-
3603
-
3604
-
3605
-
3606
-
3607
- * @example
3608
- * // Display tree
3609
- * const mm = new TreeMultiMap<number, string>();
3610
- * mm.add(1, 'a');
3611
- * expect(() => mm.print()).not.toThrow();
593
+ * @example
594
+ * // Display tree
595
+ * const mm = new TreeMultiMap<number, string>();
596
+ * mm.add(1, 'a');
597
+ * expect(() => mm.print()).not.toThrow();
3612
598
  */
3613
599
  print(): void {
3614
600
  this.#core.print();
@@ -3617,192 +603,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
3617
603
  /**
3618
604
  * Executes a callback for each entry.
3619
605
  * @remarks Time O(n), Space O(1)
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
-
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
- * @example
3799
- * // Iterate entries
3800
- * const mm = new TreeMultiMap<number, string>();
3801
- * mm.add(1, 'a');
3802
- * mm.add(2, 'b');
3803
- * const keys: number[] = [];
3804
- * mm.forEach((v, k) => keys.push(k));
3805
- * console.log(keys); // [1, 2];
606
+ * @example
607
+ * // Iterate entries
608
+ * const mm = new TreeMultiMap<number, string>();
609
+ * mm.add(1, 'a');
610
+ * mm.add(2, 'b');
611
+ * const keys: number[] = [];
612
+ * mm.forEach((v, k) => keys.push(k));
613
+ * console.log(keys); // [1, 2];
3806
614
  */
3807
615
  forEach(callback: (value: V[], key: K, map: this) => void): void {
3808
616
  for (const [k, v] of this) {
@@ -3813,192 +621,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
3813
621
  /**
3814
622
  * Creates a new map with entries that pass the predicate.
3815
623
  * @remarks Time O(n), Space O(n)
3816
-
3817
-
3818
-
3819
-
3820
-
3821
-
3822
-
3823
-
3824
-
3825
-
3826
-
3827
-
3828
-
3829
-
3830
-
3831
-
3832
-
3833
-
3834
-
3835
-
3836
-
3837
-
3838
-
3839
-
3840
-
3841
-
3842
-
3843
-
3844
-
3845
-
3846
-
3847
-
3848
-
3849
-
3850
-
3851
-
3852
-
3853
-
3854
-
3855
-
3856
-
3857
-
3858
-
3859
-
3860
-
3861
-
3862
-
3863
-
3864
-
3865
-
3866
-
3867
-
3868
-
3869
-
3870
-
3871
-
3872
-
3873
-
3874
-
3875
-
3876
-
3877
-
3878
-
3879
-
3880
-
3881
-
3882
-
3883
-
3884
-
3885
-
3886
-
3887
-
3888
-
3889
-
3890
-
3891
-
3892
-
3893
-
3894
-
3895
-
3896
-
3897
-
3898
-
3899
-
3900
-
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
- * @example
3995
- * // Filter entries
3996
- * const mm = new TreeMultiMap<number, string>();
3997
- * mm.add(1, 'a');
3998
- * mm.add(2, 'b');
3999
- * mm.add(3, 'c');
4000
- * const filtered = mm.filter((v, k) => k > 1);
4001
- * console.log([...filtered.keys()]); // [2, 3];
624
+ * @example
625
+ * // Filter entries
626
+ * const mm = new TreeMultiMap<number, string>();
627
+ * mm.add(1, 'a');
628
+ * mm.add(2, 'b');
629
+ * mm.add(3, 'c');
630
+ * const filtered = mm.filter((v, k) => k > 1);
631
+ * console.log([...filtered.keys()]); // [2, 3];
4002
632
  */
4003
633
  filter(predicate: (value: V[], key: K, map: this) => boolean): TreeMultiMap<K, V, R> {
4004
634
  const filtered: [K, V[]][] = [];
@@ -4011,194 +641,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
4011
641
  /**
4012
642
  * Creates a new map by transforming each entry.
4013
643
  * @remarks Time O(n log n), Space O(n)
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
-
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
- * @example
4193
- * // Transform values
4194
- * const mm = new TreeMultiMap<number, string>();
4195
- * mm.add(1, 'a');
4196
- * const mapped = mm.map((v, k) => [k, v.map(s => s.toUpperCase())] as [number, string[]]);
4197
- * console.log(mapped.get(1)); // ['A'];
644
+ * @example
645
+ * // Transform values
646
+ * const mm = new TreeMultiMap<number, string>();
647
+ * mm.add(1, 'a');
648
+ * const mapped = mm.map((v, k) => [k, v.map(s => s.toUpperCase())] as [number, string[]]);
649
+ * console.log(mapped.get(1)); // ['A'];
4198
650
  */
4199
- map<V2>(
4200
- mapper: (value: V[], key: K, map: this) => [K, V2[]]
4201
- ): TreeMultiMap<K, V2, R> {
651
+ map<V2>(mapper: (value: V[], key: K, map: this) => [K, V2[]]): TreeMultiMap<K, V2, R> {
4202
652
  const mapped: [K, V2[]][] = [];
4203
653
  for (const [k, v] of this) {
4204
654
  mapped.push(mapper(v, k, this));
@@ -4209,191 +659,13 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
4209
659
  /**
4210
660
  * Reduces all entries to a single value.
4211
661
  * @remarks Time O(n), Space O(1)
4212
-
4213
-
4214
-
4215
-
4216
-
4217
-
4218
-
4219
-
4220
-
4221
-
4222
-
4223
-
4224
-
4225
-
4226
-
4227
-
4228
-
4229
-
4230
-
4231
-
4232
-
4233
-
4234
-
4235
-
4236
-
4237
-
4238
-
4239
-
4240
-
4241
-
4242
-
4243
-
4244
-
4245
-
4246
-
4247
-
4248
-
4249
-
4250
-
4251
-
4252
-
4253
-
4254
-
4255
-
4256
-
4257
-
4258
-
4259
-
4260
-
4261
-
4262
-
4263
-
4264
-
4265
-
4266
-
4267
-
4268
-
4269
-
4270
-
4271
-
4272
-
4273
-
4274
-
4275
-
4276
-
4277
-
4278
-
4279
-
4280
-
4281
-
4282
-
4283
-
4284
-
4285
-
4286
-
4287
-
4288
-
4289
-
4290
-
4291
-
4292
-
4293
-
4294
-
4295
-
4296
-
4297
-
4298
-
4299
-
4300
-
4301
-
4302
-
4303
-
4304
-
4305
-
4306
-
4307
-
4308
-
4309
-
4310
-
4311
-
4312
-
4313
-
4314
-
4315
-
4316
-
4317
-
4318
-
4319
-
4320
-
4321
-
4322
-
4323
-
4324
-
4325
-
4326
-
4327
-
4328
-
4329
-
4330
-
4331
-
4332
-
4333
-
4334
-
4335
-
4336
-
4337
-
4338
-
4339
-
4340
-
4341
-
4342
-
4343
-
4344
-
4345
-
4346
-
4347
-
4348
-
4349
-
4350
-
4351
-
4352
-
4353
-
4354
-
4355
-
4356
-
4357
-
4358
-
4359
-
4360
-
4361
-
4362
-
4363
-
4364
-
4365
-
4366
-
4367
-
4368
-
4369
-
4370
-
4371
-
4372
-
4373
-
4374
-
4375
-
4376
-
4377
-
4378
-
4379
-
4380
-
4381
-
4382
-
4383
-
4384
-
4385
-
4386
-
4387
-
4388
-
4389
-
4390
- * @example
4391
- * // Aggregate
4392
- * const mm = new TreeMultiMap<number, number>();
4393
- * mm.add(1, 10);
4394
- * mm.add(2, 20);
4395
- * const sum = mm.reduce((acc, v) => acc + v.reduce((a, b) => a + b, 0), 0);
4396
- * console.log(sum); // 30;
662
+ * @example
663
+ * // Aggregate
664
+ * const mm = new TreeMultiMap<number, number>();
665
+ * mm.add(1, 10);
666
+ * mm.add(2, 20);
667
+ * const sum = mm.reduce((acc, v) => acc + v.reduce((a, b) => a + b, 0), 0);
668
+ * console.log(sum); // 30;
4397
669
  */
4398
670
  reduce<U>(callback: (accumulator: U, value: V[], key: K, map: this) => U, initialValue: U): U {
4399
671
  let acc = initialValue;
@@ -4406,181 +678,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
4406
678
  /**
4407
679
  * Sets multiple entries at once.
4408
680
  * @remarks Time O(m log n), Space O(m) where m is input size
4409
-
4410
-
4411
-
4412
-
4413
-
4414
-
4415
-
4416
-
4417
-
4418
-
4419
-
4420
-
4421
-
4422
-
4423
-
4424
-
4425
-
4426
-
4427
-
4428
-
4429
-
4430
-
4431
-
4432
-
4433
-
4434
-
4435
-
4436
-
4437
-
4438
-
4439
-
4440
-
4441
-
4442
-
4443
-
4444
-
4445
-
4446
-
4447
-
4448
-
4449
-
4450
-
4451
-
4452
-
4453
-
4454
-
4455
-
4456
-
4457
-
4458
-
4459
-
4460
-
4461
-
4462
-
4463
-
4464
-
4465
-
4466
-
4467
-
4468
-
4469
-
4470
-
4471
-
4472
-
4473
-
4474
-
4475
-
4476
-
4477
-
4478
-
4479
-
4480
-
4481
-
4482
-
4483
-
4484
-
4485
-
4486
-
4487
-
4488
-
4489
-
4490
-
4491
-
4492
-
4493
-
4494
-
4495
-
4496
-
4497
-
4498
-
4499
-
4500
-
4501
-
4502
-
4503
-
4504
-
4505
-
4506
-
4507
-
4508
-
4509
-
4510
-
4511
-
4512
-
4513
-
4514
-
4515
-
4516
-
4517
-
4518
-
4519
-
4520
-
4521
-
4522
-
4523
-
4524
-
4525
-
4526
-
4527
-
4528
-
4529
-
4530
-
4531
-
4532
-
4533
-
4534
-
4535
-
4536
-
4537
-
4538
-
4539
-
4540
-
4541
-
4542
-
4543
-
4544
-
4545
-
4546
-
4547
-
4548
-
4549
-
4550
-
4551
-
4552
-
4553
-
4554
-
4555
-
4556
-
4557
-
4558
-
4559
-
4560
-
4561
-
4562
-
4563
-
4564
-
4565
-
4566
-
4567
-
4568
-
4569
-
4570
-
4571
-
4572
-
4573
-
4574
-
4575
-
4576
-
4577
-
4578
-
4579
- * @example
4580
- * // Set multiple entries
4581
- * const mm = new TreeMultiMap<number, string>();
4582
- * mm.setMany([[1, ['a']], [2, ['b']]]);
4583
- * console.log(mm.size); // 2;
681
+ * @example
682
+ * // Set multiple entries
683
+ * const mm = new TreeMultiMap<number, string>();
684
+ * mm.setMany([
685
+ * [1, ['a']],
686
+ * [2, ['b']]
687
+ * ]);
688
+ * console.log(mm.size); // 2;
4584
689
  */
4585
690
  setMany(keysNodesEntriesOrRaws: Iterable<K | [K | null | undefined, V[] | undefined]>): boolean[] {
4586
691
  const results: boolean[] = [];
@@ -4594,156 +699,14 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
4594
699
  /**
4595
700
  * Searches for entries within a key range.
4596
701
  * @remarks Time O(log n + k), Space O(k) where k is result size
4597
-
4598
-
4599
-
4600
-
4601
-
4602
-
4603
-
4604
-
4605
-
4606
-
4607
-
4608
-
4609
-
4610
-
4611
-
4612
-
4613
-
4614
-
4615
-
4616
-
4617
-
4618
-
4619
-
4620
-
4621
-
4622
-
4623
-
4624
-
4625
-
4626
-
4627
-
4628
-
4629
-
4630
-
4631
-
4632
-
4633
-
4634
-
4635
-
4636
-
4637
-
4638
-
4639
-
4640
-
4641
-
4642
-
4643
-
4644
-
4645
-
4646
-
4647
-
4648
-
4649
-
4650
-
4651
-
4652
-
4653
-
4654
-
4655
-
4656
-
4657
-
4658
-
4659
-
4660
-
4661
-
4662
-
4663
-
4664
-
4665
-
4666
-
4667
-
4668
-
4669
-
4670
-
4671
-
4672
-
4673
-
4674
-
4675
-
4676
-
4677
-
4678
-
4679
-
4680
-
4681
-
4682
-
4683
-
4684
-
4685
-
4686
-
4687
-
4688
-
4689
-
4690
-
4691
-
4692
-
4693
-
4694
-
4695
-
4696
-
4697
-
4698
-
4699
-
4700
-
4701
-
4702
-
4703
-
4704
-
4705
-
4706
-
4707
-
4708
-
4709
-
4710
-
4711
-
4712
-
4713
-
4714
-
4715
-
4716
-
4717
-
4718
-
4719
-
4720
-
4721
-
4722
-
4723
-
4724
-
4725
-
4726
-
4727
-
4728
-
4729
-
4730
-
4731
-
4732
-
4733
-
4734
-
4735
-
4736
-
4737
-
4738
-
4739
- * @example
4740
- * // Find keys in range
4741
- * const mm = new TreeMultiMap<number, string>();
4742
- * mm.add(10, 'a');
4743
- * mm.add(20, 'b');
4744
- * mm.add(30, 'c');
4745
- * const result = mm.rangeSearch([15, 25]);
4746
- * console.log(result.length); // 1;
702
+ * @example
703
+ * // Find keys in range
704
+ * const mm = new TreeMultiMap<number, string>();
705
+ * mm.add(10, 'a');
706
+ * mm.add(20, 'b');
707
+ * mm.add(30, 'c');
708
+ * const result = mm.rangeSearch([15, 25]);
709
+ * console.log(result.length); // 1;
4747
710
  */
4748
711
  rangeSearch<C extends (node: RedBlackTreeNode<K, V[]>) => unknown>(
4749
712
  range: Range<K> | [K, K],
@@ -4755,270 +718,87 @@ export class TreeMultiMap<K = any, V = any, R = any> implements Iterable<[K, V[]
4755
718
  /**
4756
719
  * Creates a shallow clone of this map.
4757
720
  * @remarks Time O(n log n), Space O(n)
4758
-
4759
-
4760
-
4761
-
4762
-
4763
-
4764
-
4765
-
4766
-
4767
-
4768
-
4769
-
4770
-
4771
-
4772
-
4773
-
4774
-
4775
-
4776
-
4777
-
4778
-
4779
-
4780
-
4781
-
4782
-
4783
-
4784
-
4785
-
4786
-
4787
-
4788
-
4789
-
4790
-
4791
-
4792
-
4793
-
4794
-
4795
-
4796
-
4797
-
4798
-
4799
-
4800
-
4801
-
4802
-
4803
-
4804
-
4805
-
4806
-
4807
-
4808
-
4809
-
4810
-
4811
-
4812
-
4813
-
4814
-
4815
-
4816
-
4817
-
4818
-
4819
-
4820
-
4821
-
4822
-
4823
-
4824
-
4825
-
4826
-
4827
-
4828
-
4829
-
4830
-
4831
-
4832
-
4833
-
4834
-
4835
-
4836
-
4837
-
4838
-
4839
-
4840
-
4841
-
4842
-
4843
-
4844
-
4845
-
4846
-
4847
-
4848
-
4849
-
4850
-
4851
-
4852
-
4853
-
4854
-
4855
-
4856
-
4857
-
4858
-
4859
-
4860
-
4861
-
4862
-
4863
-
4864
-
4865
-
4866
-
4867
-
4868
-
4869
-
4870
-
4871
-
4872
-
4873
-
4874
-
4875
-
4876
-
4877
-
4878
-
4879
-
4880
-
4881
-
4882
-
4883
-
4884
-
4885
-
4886
-
4887
-
4888
-
4889
-
4890
-
4891
-
4892
-
4893
-
4894
-
4895
-
4896
-
4897
-
4898
-
4899
-
4900
-
4901
-
4902
-
4903
-
4904
-
4905
-
4906
-
4907
-
4908
-
4909
-
4910
-
4911
-
4912
-
4913
-
4914
- * @example
4915
- * // Order-statistic on BST
4916
- * const tree = new TreeMultiMap<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
4917
- * console.log(tree.getByRank(0)); // 10;
4918
- * console.log(tree.getByRank(4)); // 50;
4919
- * console.log(tree.getRank(30)); // 2;
721
+ * @example
722
+ * // Order-statistic on BST
723
+ * const tree = new TreeMultiMap<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
724
+ * console.log(tree.getByRank(0)); // 10;
725
+ * console.log(tree.getByRank(4)); // 50;
726
+ * console.log(tree.getRank(30)); // 2;
4920
727
  */
4921
728
  // ─── Order-Statistic Methods ───────────────────────────
4922
-
4923
729
  getByRank(k: number): [K, V[]] | undefined {
4924
730
  const key = this.#core.getByRank(k);
4925
731
  if (key === undefined) return undefined;
4926
732
  return [key, this.#core.get(key) ?? []];
4927
733
  }
4928
734
 
4929
- /**
735
+ /**
4930
736
  * Get the rank of a key in sorted order
4931
737
  * @example
4932
- * // Get the rank of a key in sorted order
4933
- * const tree = new TreeMultiMap<number>(
4934
- * [10, 20, 30, 40, 50],
4935
- * { enableOrderStatistic: true }
4936
- * );
4937
- * console.log(tree.getRank(10)); // 0; // smallest → rank 0
4938
- * console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
4939
- * console.log(tree.getRank(50)); // 4; // largest → rank 4
4940
- * console.log(tree.getRank(25)); // 2;
738
+ * // Get the rank of a key in sorted order
739
+ * const tree = new TreeMultiMap<number>(
740
+ * [10, 20, 30, 40, 50],
741
+ * { enableOrderStatistic: true }
742
+ * );
743
+ * console.log(tree.getRank(10)); // 0; // smallest → rank 0
744
+ * console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
745
+ * console.log(tree.getRank(50)); // 4; // largest → rank 4
746
+ * console.log(tree.getRank(25)); // 2;
4941
747
  */
4942
748
  getRank(key: K): number {
4943
749
  return this.#core.getRank(key);
4944
750
  }
4945
751
 
4946
- /**
752
+ /**
4947
753
  * Get elements by rank range
4948
-
4949
-
4950
-
4951
-
4952
-
4953
-
4954
-
4955
-
4956
-
4957
- * @example
4958
- * // Pagination by position in tree order
4959
- * const tree = new TreeMultiMap<number>(
4960
- * [10, 20, 30, 40, 50, 60, 70, 80, 90],
4961
- * { enableOrderStatistic: true }
4962
- * );
4963
- * const pageSize = 3;
4964
- *
4965
- * // Page 1
4966
- * console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
4967
- * // Page 2
4968
- * console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
4969
- * // Page 3
4970
- * console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
754
+ * @example
755
+ * // Pagination by position in tree order
756
+ * const tree = new TreeMultiMap<number>([10, 20, 30, 40, 50, 60, 70, 80, 90], { enableOrderStatistic: true });
757
+ * const pageSize = 3;
758
+ *
759
+ * // Page 1
760
+ * console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
761
+ * // Page 2
762
+ * console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
763
+ * // Page 3
764
+ * console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
4971
765
  */
4972
766
  rangeByRank(start: number, end: number): Array<[K, V[]]> {
4973
767
  const keys = this.#core.rangeByRank(start, end);
4974
- return keys
4975
- .filter((k): k is K => k !== undefined)
4976
- .map(k => [k, this.#core.get(k) ?? []] as [K, V[]]);
768
+ return keys.filter((k): k is K => k !== undefined).map(k => [k, this.#core.get(k) ?? []] as [K, V[]]);
4977
769
  }
4978
770
 
4979
- /**
771
+ /**
4980
772
  * Deep copy
4981
-
4982
-
4983
-
4984
-
4985
-
4986
-
4987
-
4988
-
4989
-
4990
-
4991
-
4992
-
4993
-
4994
-
4995
-
4996
-
4997
-
4998
-
4999
-
5000
-
5001
-
5002
-
5003
-
5004
-
5005
- * @example
5006
- * // Deep clone
5007
- * const mm = new TreeMultiMap<number, string>();
5008
- * mm.add(1, 'a');
5009
- * const copy = mm.clone();
5010
- * copy.delete(1);
5011
- * console.log(mm.has(1)); // true;
773
+ * @example
774
+ * // Deep clone
775
+ * const mm = new TreeMultiMap<number, string>();
776
+ * mm.add(1, 'a');
777
+ * const copy = mm.clone();
778
+ * copy.delete(1);
779
+ * console.log(mm.has(1)); // true;
5012
780
  */
5013
781
  clone(): TreeMultiMap<K, V, R> {
5014
782
  return new TreeMultiMap<K, V, R>(this, { comparator: this.comparator, isMapMode: this.#core.isMapMode });
5015
783
  }
5016
784
 
5017
785
  /**
5018
- * Expose comparator for advanced usage/testing (read-only).
786
+ * Validates the key against the default comparator rules.
5019
787
  * @remarks Time O(1), Space O(1)
5020
788
  */
5021
- get comparator(): Comparator<K> {
5022
- return this.#core.comparator;
789
+ private _validateKey(key: K): void {
790
+ if (!this.#isDefaultComparator) return;
791
+ // reuse TreeSet strict validation (same policy)
792
+ // NOTE: TreeSet._validateKey is private, so we replicate the checks.
793
+ if (typeof key === 'number') {
794
+ if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeMultiMap'));
795
+ return;
796
+ }
797
+ if (typeof key === 'string') return;
798
+ if (key instanceof Date) {
799
+ if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeMultiMap'));
800
+ return;
801
+ }
802
+ raise(TypeError, ERR.comparatorRequired('TreeMultiMap'));
5023
803
  }
5024
804
  }