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
@@ -6,9 +6,13 @@
6
6
  * - Native Set-like surface + Java NavigableSet-like helpers
7
7
  * - Strict default comparator (number/string/Date), otherwise require comparator
8
8
  */
9
-
10
- import type { Comparator } from '../../types';
11
- import type { TreeSetElementCallback, TreeSetOptions, TreeSetRangeOptions, TreeSetReduceCallback } from '../../types';
9
+ import type {
10
+ Comparator,
11
+ TreeSetElementCallback,
12
+ TreeSetOptions,
13
+ TreeSetRangeOptions,
14
+ TreeSetReduceCallback
15
+ } from '../../types';
12
16
  import { ERR, raise } from '../../common';
13
17
  import { RedBlackTree } from './red-black-tree';
14
18
 
@@ -48,16 +52,25 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
48
52
  const toElementFn = options.toElementFn;
49
53
  const comparator = options.comparator ?? TreeSet.createDefaultComparator<K>();
50
54
  this.#isDefaultComparator = options.comparator === undefined;
51
-
52
55
  // RedBlackTree expects an iterable of keys/entries/nodes/raws; for TreeSet we only accept keys.
53
- this.#core = new RedBlackTree<K, undefined>([], { comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
54
-
56
+ this.#core = new RedBlackTree<K, undefined>([], {
57
+ comparator,
58
+ isMapMode: options.isMapMode,
59
+ enableOrderStatistic: options.enableOrderStatistic
60
+ });
55
61
  for (const item of elements) {
56
- const k = toElementFn ? toElementFn(item as R) : item as K;
62
+ const k = toElementFn ? toElementFn(item as R) : (item as K);
57
63
  this.add(k);
58
64
  }
59
65
  }
60
66
 
67
+ /**
68
+ * Number of elements in the set.
69
+ */
70
+ get size(): number {
71
+ return this.#core.size;
72
+ }
73
+
61
74
  /**
62
75
  * Create the strict default comparator.
63
76
  *
@@ -78,11 +91,9 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
78
91
  const bb = Object.is(b, -0) ? 0 : b;
79
92
  return aa > bb ? 1 : aa < bb ? -1 : 0;
80
93
  }
81
-
82
94
  if (typeof a === 'string' && typeof b === 'string') {
83
95
  return a > b ? 1 : a < b ? -1 : 0;
84
96
  }
85
-
86
97
  if (a instanceof Date && b instanceof Date) {
87
98
  const ta = a.getTime();
88
99
  const tb = b.getTime();
@@ -90,420 +101,34 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
90
101
  if (Number.isNaN(ta) || Number.isNaN(tb)) raise(TypeError, ERR.invalidDate('TreeSet'));
91
102
  return ta > tb ? 1 : ta < tb ? -1 : 0;
92
103
  }
93
-
94
104
  raise(TypeError, ERR.comparatorRequired('TreeSet'));
95
105
  };
96
106
  }
97
107
 
98
- /**
99
- * Number of elements in the set.
100
- */
101
- get size(): number {
102
- return this.#core.size;
103
- }
104
-
105
108
  /**
106
109
  * Whether the set is empty.
107
-
108
-
109
-
110
-
111
-
112
-
113
-
114
-
115
-
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
- * @example
286
- * // Check empty
287
- * console.log(new TreeSet().isEmpty()); // true;
110
+ * @example
111
+ * // Check empty
112
+ * console.log(new TreeSet().isEmpty()); // true;
288
113
  */
289
114
  isEmpty(): boolean {
290
115
  return this.size === 0;
291
116
  }
292
117
 
293
- private _validateKey(key: K): void {
294
- if (!this.#isDefaultComparator) return;
295
-
296
- if (typeof key === 'number') {
297
- if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeSet'));
298
- return;
299
- }
300
-
301
- if (typeof key === 'string') return;
302
-
303
- if (key instanceof Date) {
304
- if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeSet'));
305
- return;
306
- }
307
-
308
- // Other key types should have provided a comparator, so reaching here means misuse.
309
- raise(TypeError, ERR.comparatorRequired('TreeSet'));
310
- }
311
-
312
118
  /**
313
119
  * Add a key to the set (no-op if already present).
314
120
  * @remarks Expected time O(log n)
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
-
484
-
485
-
486
-
487
-
488
-
489
-
490
-
491
-
492
-
493
-
494
-
495
-
496
- * @example
497
- * // Unique tags with sorted order
498
- * const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
499
- *
500
- * // Duplicates removed, sorted alphabetically
501
- * console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
502
- * console.log(tags.size); // 4;
503
- *
504
- * tags.add('angular');
505
- * console.log(tags.first()); // 'angular';
506
- * console.log(tags.last()); // 'typescript';
121
+ * @example
122
+ * // Unique tags with sorted order
123
+ * const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
124
+ *
125
+ * // Duplicates removed, sorted alphabetically
126
+ * console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
127
+ * console.log(tags.size); // 4;
128
+ *
129
+ * tags.add('angular');
130
+ * console.log(tags.first()); // 'angular';
131
+ * console.log(tags.last()); // 'typescript';
507
132
  */
508
133
  add(key: K): this {
509
134
  this._validateKey(key);
@@ -517,27 +142,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
517
142
  * @remarks Expected time O(m log n), where m is the number of keys.
518
143
  * @param keys - Iterable of keys to add.
519
144
  * @returns Array of booleans indicating whether each key was newly added.
520
-
521
-
522
-
523
-
524
-
525
-
526
-
527
-
528
-
529
-
530
-
531
-
532
-
533
-
534
-
535
-
536
- * @example
537
- * // Add multiple keys
538
- * const ts = new TreeSet<number>();
539
- * ts.addMany([5, 3, 7, 1, 9]);
540
- * console.log(ts.size); // 5;
145
+ * @example
146
+ * // Add multiple keys
147
+ * const ts = new TreeSet<number>();
148
+ * ts.addMany([5, 3, 7, 1, 9]);
149
+ * console.log(ts.size); // 5;
541
150
  */
542
151
  addMany(keys: Iterable<K>): boolean[] {
543
152
  const results: boolean[] = [];
@@ -551,201 +160,12 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
551
160
  /**
552
161
  * Test whether a key exists.
553
162
  * @remarks Expected time O(log n)
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
-
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
- * @example
744
- * // Checking membership in a sorted collection
745
- * const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
746
- *
747
- * console.log(allowed.has('admin')); // true;
748
- * console.log(allowed.has('guest')); // false;
163
+ * @example
164
+ * // Checking membership in a sorted collection
165
+ * const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
166
+ *
167
+ * console.log(allowed.has('admin')); // true;
168
+ * console.log(allowed.has('guest')); // false;
749
169
  */
750
170
  has(key: K): boolean {
751
171
  this._validateKey(key);
@@ -756,202 +176,13 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
756
176
  * Delete a key.
757
177
  * @returns `true` if the key existed; otherwise `false`.
758
178
  * @remarks Expected time O(log n)
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
-
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
- * @example
949
- * // Removing elements while maintaining order
950
- * const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
951
- *
952
- * console.log(nums.delete(5)); // true;
953
- * console.log(nums.delete(5)); // false; // already gone
954
- * console.log([...nums]); // [1, 3, 7, 9];
179
+ * @example
180
+ * // Removing elements while maintaining order
181
+ * const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
182
+ *
183
+ * console.log(nums.delete(5)); // true;
184
+ * console.log(nums.delete(5)); // false; // already gone
185
+ * console.log([...nums]); // [1, 3, 7, 9];
955
186
  */
956
187
  delete(key: K): boolean {
957
188
  this._validateKey(key);
@@ -978,189 +209,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
978
209
 
979
210
  /**
980
211
  * Remove all keys.
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
-
1045
-
1046
-
1047
-
1048
-
1049
-
1050
-
1051
-
1052
-
1053
-
1054
-
1055
-
1056
-
1057
-
1058
-
1059
-
1060
-
1061
-
1062
-
1063
-
1064
-
1065
-
1066
-
1067
-
1068
-
1069
-
1070
-
1071
-
1072
-
1073
-
1074
-
1075
-
1076
-
1077
-
1078
-
1079
-
1080
-
1081
-
1082
-
1083
-
1084
-
1085
-
1086
-
1087
-
1088
-
1089
-
1090
-
1091
-
1092
-
1093
-
1094
-
1095
-
1096
-
1097
-
1098
-
1099
-
1100
-
1101
-
1102
-
1103
-
1104
-
1105
-
1106
-
1107
-
1108
-
1109
-
1110
-
1111
-
1112
-
1113
-
1114
-
1115
-
1116
-
1117
-
1118
-
1119
-
1120
-
1121
-
1122
-
1123
-
1124
-
1125
-
1126
-
1127
-
1128
-
1129
-
1130
-
1131
-
1132
-
1133
-
1134
-
1135
-
1136
-
1137
-
1138
-
1139
-
1140
-
1141
-
1142
-
1143
-
1144
-
1145
-
1146
-
1147
-
1148
-
1149
-
1150
-
1151
-
1152
-
1153
-
1154
-
1155
-
1156
-
1157
-
1158
-
1159
- * @example
1160
- * // Remove all
1161
- * const ts = new TreeSet<number>([1, 2]);
1162
- * ts.clear();
1163
- * console.log(ts.isEmpty()); // true;
212
+ * @example
213
+ * // Remove all
214
+ * const ts = new TreeSet<number>([1, 2]);
215
+ * ts.clear();
216
+ * console.log(ts.isEmpty()); // true;
1164
217
  */
1165
218
  clear(): void {
1166
219
  this.#core.clear();
@@ -1168,188 +221,10 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1168
221
 
1169
222
  /**
1170
223
  * Iterate over keys in ascending order.
1171
-
1172
-
1173
-
1174
-
1175
-
1176
-
1177
-
1178
-
1179
-
1180
-
1181
-
1182
-
1183
-
1184
-
1185
-
1186
-
1187
-
1188
-
1189
-
1190
-
1191
-
1192
-
1193
-
1194
-
1195
-
1196
-
1197
-
1198
-
1199
-
1200
-
1201
-
1202
-
1203
-
1204
-
1205
-
1206
-
1207
-
1208
-
1209
-
1210
-
1211
-
1212
-
1213
-
1214
-
1215
-
1216
-
1217
-
1218
-
1219
-
1220
-
1221
-
1222
-
1223
-
1224
-
1225
-
1226
-
1227
-
1228
-
1229
-
1230
-
1231
-
1232
-
1233
-
1234
-
1235
-
1236
-
1237
-
1238
-
1239
-
1240
-
1241
-
1242
-
1243
-
1244
-
1245
-
1246
-
1247
-
1248
-
1249
-
1250
-
1251
-
1252
-
1253
-
1254
-
1255
-
1256
-
1257
-
1258
-
1259
-
1260
-
1261
-
1262
-
1263
-
1264
-
1265
-
1266
-
1267
-
1268
-
1269
-
1270
-
1271
-
1272
-
1273
-
1274
-
1275
-
1276
-
1277
-
1278
-
1279
-
1280
-
1281
-
1282
-
1283
-
1284
-
1285
-
1286
-
1287
-
1288
-
1289
-
1290
-
1291
-
1292
-
1293
-
1294
-
1295
-
1296
-
1297
-
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
- * @example
1350
- * // Get sorted keys
1351
- * const ts = new TreeSet<number>([30, 10, 20]);
1352
- * console.log([...ts.keys()]); // [10, 20, 30];
224
+ * @example
225
+ * // Get sorted keys
226
+ * const ts = new TreeSet<number>([30, 10, 20]);
227
+ * console.log([...ts.keys()]); // [10, 20, 30];
1353
228
  */
1354
229
  keys(): IterableIterator<K> {
1355
230
  return this.#core.keys();
@@ -1359,188 +234,10 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1359
234
  * Iterate over values in ascending order.
1360
235
  *
1361
236
  * Note: for Set-like containers, `values()` is the same as `keys()`.
1362
-
1363
-
1364
-
1365
-
1366
-
1367
-
1368
-
1369
-
1370
-
1371
-
1372
-
1373
-
1374
-
1375
-
1376
-
1377
-
1378
-
1379
-
1380
-
1381
-
1382
-
1383
-
1384
-
1385
-
1386
-
1387
-
1388
-
1389
-
1390
-
1391
-
1392
-
1393
-
1394
-
1395
-
1396
-
1397
-
1398
-
1399
-
1400
-
1401
-
1402
-
1403
-
1404
-
1405
-
1406
-
1407
-
1408
-
1409
-
1410
-
1411
-
1412
-
1413
-
1414
-
1415
-
1416
-
1417
-
1418
-
1419
-
1420
-
1421
-
1422
-
1423
-
1424
-
1425
-
1426
-
1427
-
1428
-
1429
-
1430
-
1431
-
1432
-
1433
-
1434
-
1435
-
1436
-
1437
-
1438
-
1439
-
1440
-
1441
-
1442
-
1443
-
1444
-
1445
-
1446
-
1447
-
1448
-
1449
-
1450
-
1451
-
1452
-
1453
-
1454
-
1455
-
1456
-
1457
-
1458
-
1459
-
1460
-
1461
-
1462
-
1463
-
1464
-
1465
-
1466
-
1467
-
1468
-
1469
-
1470
-
1471
-
1472
-
1473
-
1474
-
1475
-
1476
-
1477
-
1478
-
1479
-
1480
-
1481
-
1482
-
1483
-
1484
-
1485
-
1486
-
1487
-
1488
-
1489
-
1490
-
1491
-
1492
-
1493
-
1494
-
1495
-
1496
-
1497
-
1498
-
1499
-
1500
-
1501
-
1502
-
1503
-
1504
-
1505
-
1506
-
1507
-
1508
-
1509
-
1510
-
1511
-
1512
-
1513
-
1514
-
1515
-
1516
-
1517
-
1518
-
1519
-
1520
-
1521
-
1522
-
1523
-
1524
-
1525
-
1526
-
1527
-
1528
-
1529
-
1530
-
1531
-
1532
-
1533
-
1534
-
1535
-
1536
-
1537
-
1538
-
1539
-
1540
- * @example
1541
- * // Get values (same as keys for Set)
1542
- * const ts = new TreeSet<number>([2, 1, 3]);
1543
- * console.log([...ts.values()]); // [1, 2, 3];
237
+ * @example
238
+ * // Get values (same as keys for Set)
239
+ * const ts = new TreeSet<number>([2, 1, 3]);
240
+ * console.log([...ts.values()]); // [1, 2, 3];
1544
241
  */
1545
242
  values(): IterableIterator<K> {
1546
243
  return this.keys();
@@ -1550,188 +247,10 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1550
247
  * Iterate over `[value, value]` pairs (native Set convention).
1551
248
  *
1552
249
  * Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
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
-
1726
-
1727
-
1728
-
1729
-
1730
-
1731
- * @example
1732
- * // Iterate entries
1733
- * const ts = new TreeSet<number>([3, 1, 2]);
1734
- * console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
250
+ * @example
251
+ * // Iterate entries
252
+ * const ts = new TreeSet<number>([3, 1, 2]);
253
+ * console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
1735
254
  */
1736
255
  *entries(): IterableIterator<[K, K]> {
1737
256
  for (const k of this.keys()) yield [k, k];
@@ -1745,190 +264,12 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1745
264
  * Visit each value in ascending order.
1746
265
  *
1747
266
  * Callback follows native Set convention: `(value, value2, set)`.
1748
-
1749
-
1750
-
1751
-
1752
-
1753
-
1754
-
1755
-
1756
-
1757
-
1758
-
1759
-
1760
-
1761
-
1762
-
1763
-
1764
-
1765
-
1766
-
1767
-
1768
-
1769
-
1770
-
1771
-
1772
-
1773
-
1774
-
1775
-
1776
-
1777
-
1778
-
1779
-
1780
-
1781
-
1782
-
1783
-
1784
-
1785
-
1786
-
1787
-
1788
-
1789
-
1790
-
1791
-
1792
-
1793
-
1794
-
1795
-
1796
-
1797
-
1798
-
1799
-
1800
-
1801
-
1802
-
1803
-
1804
-
1805
-
1806
-
1807
-
1808
-
1809
-
1810
-
1811
-
1812
-
1813
-
1814
-
1815
-
1816
-
1817
-
1818
-
1819
-
1820
-
1821
-
1822
-
1823
-
1824
-
1825
-
1826
-
1827
-
1828
-
1829
-
1830
-
1831
-
1832
-
1833
-
1834
-
1835
-
1836
-
1837
-
1838
-
1839
-
1840
-
1841
-
1842
-
1843
-
1844
-
1845
-
1846
-
1847
-
1848
-
1849
-
1850
-
1851
-
1852
-
1853
-
1854
-
1855
-
1856
-
1857
-
1858
-
1859
-
1860
-
1861
-
1862
-
1863
-
1864
-
1865
-
1866
-
1867
-
1868
-
1869
-
1870
-
1871
-
1872
-
1873
-
1874
-
1875
-
1876
-
1877
-
1878
-
1879
-
1880
-
1881
-
1882
-
1883
-
1884
-
1885
-
1886
-
1887
-
1888
-
1889
-
1890
-
1891
-
1892
-
1893
-
1894
-
1895
-
1896
-
1897
-
1898
-
1899
-
1900
-
1901
-
1902
-
1903
-
1904
-
1905
-
1906
-
1907
-
1908
-
1909
-
1910
-
1911
-
1912
-
1913
-
1914
-
1915
-
1916
-
1917
-
1918
-
1919
-
1920
-
1921
-
1922
-
1923
-
1924
-
1925
-
1926
- * @example
1927
- * // Execute for each
1928
- * const ts = new TreeSet<number>([3, 1, 2]);
1929
- * const keys: number[] = [];
1930
- * ts.forEach(k => keys.push(k));
1931
- * console.log(keys); // [1, 2, 3];
267
+ * @example
268
+ * // Execute for each
269
+ * const ts = new TreeSet<number>([3, 1, 2]);
270
+ * const keys: number[] = [];
271
+ * ts.forEach(k => keys.push(k));
272
+ * console.log(keys); // [1, 2, 3];
1932
273
  */
1933
274
  forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: unknown): void {
1934
275
  for (const k of this) cb.call(thisArg, k, k, this);
@@ -1939,189 +280,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
1939
280
  *
1940
281
  * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
1941
282
  * @remarks Time O(n log n) expected, Space O(n)
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
-
2086
-
2087
-
2088
-
2089
-
2090
-
2091
-
2092
-
2093
-
2094
-
2095
-
2096
-
2097
-
2098
-
2099
-
2100
-
2101
-
2102
-
2103
-
2104
-
2105
-
2106
-
2107
-
2108
-
2109
-
2110
-
2111
-
2112
-
2113
-
2114
-
2115
-
2116
-
2117
-
2118
-
2119
-
2120
- * @example
2121
- * // Transform
2122
- * const ts = new TreeSet<number>([1, 2, 3]);
2123
- * const doubled = ts.map(k => k * 2);
2124
- * console.log([...doubled]); // [2, 4, 6];
283
+ * @example
284
+ * // Transform
285
+ * const ts = new TreeSet<number>([1, 2, 3]);
286
+ * const doubled = ts.map(k => k * 2);
287
+ * console.log([...doubled]); // [2, 4, 6];
2125
288
  */
2126
289
  map<MK>(
2127
290
  callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
@@ -2131,9 +294,10 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
2131
294
  const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
2132
295
  let index = 0;
2133
296
  for (const v of this) {
2134
- const mk = thisArg === undefined
2135
- ? callbackfn(v, index++, this)
2136
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
297
+ const mk =
298
+ thisArg === undefined
299
+ ? callbackfn(v, index++, this)
300
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
2137
301
  out.add(mk);
2138
302
  }
2139
303
  return out;
@@ -2142,197 +306,25 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
2142
306
  /**
2143
307
  * Create a new TreeSet containing only values that satisfy the predicate.
2144
308
  * @remarks Time O(n log n) expected, Space O(n)
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
-
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
- * @example
2324
- * // Filter
2325
- * const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
2326
- * const evens = ts.filter(k => k % 2 === 0);
2327
- * console.log([...evens]); // [2, 4];
309
+ * @example
310
+ * // Filter
311
+ * const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
312
+ * const evens = ts.filter(k => k % 2 === 0);
313
+ * console.log([...evens]); // [2, 4];
2328
314
  */
2329
315
  filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
2330
316
  const out = new TreeSet<K>([], { comparator: this.#userComparator });
2331
317
  let index = 0;
2332
318
  for (const v of this) {
2333
- const ok = thisArg === undefined
2334
- ? callbackfn(v, index++, this)
2335
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
319
+ const ok =
320
+ thisArg === undefined
321
+ ? callbackfn(v, index++, this)
322
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(
323
+ thisArg,
324
+ v,
325
+ index++,
326
+ this
327
+ );
2336
328
  if (ok) out.add(v);
2337
329
  }
2338
330
  return out;
@@ -2341,189 +333,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
2341
333
  /**
2342
334
  * Reduce values into a single accumulator.
2343
335
  * @remarks Time O(n), Space O(1)
2344
-
2345
-
2346
-
2347
-
2348
-
2349
-
2350
-
2351
-
2352
-
2353
-
2354
-
2355
-
2356
-
2357
-
2358
-
2359
-
2360
-
2361
-
2362
-
2363
-
2364
-
2365
-
2366
-
2367
-
2368
-
2369
-
2370
-
2371
-
2372
-
2373
-
2374
-
2375
-
2376
-
2377
-
2378
-
2379
-
2380
-
2381
-
2382
-
2383
-
2384
-
2385
-
2386
-
2387
-
2388
-
2389
-
2390
-
2391
-
2392
-
2393
-
2394
-
2395
-
2396
-
2397
-
2398
-
2399
-
2400
-
2401
-
2402
-
2403
-
2404
-
2405
-
2406
-
2407
-
2408
-
2409
-
2410
-
2411
-
2412
-
2413
-
2414
-
2415
-
2416
-
2417
-
2418
-
2419
-
2420
-
2421
-
2422
-
2423
-
2424
-
2425
-
2426
-
2427
-
2428
-
2429
-
2430
-
2431
-
2432
-
2433
-
2434
-
2435
-
2436
-
2437
-
2438
-
2439
-
2440
-
2441
-
2442
-
2443
-
2444
-
2445
-
2446
-
2447
-
2448
-
2449
-
2450
-
2451
-
2452
-
2453
-
2454
-
2455
-
2456
-
2457
-
2458
-
2459
-
2460
-
2461
-
2462
-
2463
-
2464
-
2465
-
2466
-
2467
-
2468
-
2469
-
2470
-
2471
-
2472
-
2473
-
2474
-
2475
-
2476
-
2477
-
2478
-
2479
-
2480
-
2481
-
2482
-
2483
-
2484
-
2485
-
2486
-
2487
-
2488
-
2489
-
2490
-
2491
-
2492
-
2493
-
2494
-
2495
-
2496
-
2497
-
2498
-
2499
-
2500
-
2501
-
2502
-
2503
-
2504
-
2505
-
2506
-
2507
-
2508
-
2509
-
2510
-
2511
-
2512
-
2513
-
2514
-
2515
-
2516
-
2517
-
2518
-
2519
-
2520
-
2521
-
2522
- * @example
2523
- * // Aggregate
2524
- * const ts = new TreeSet<number>([1, 2, 3]);
2525
- * const sum = ts.reduce((acc, k) => acc + k, 0);
2526
- * console.log(sum); // 6;
336
+ * @example
337
+ * // Aggregate
338
+ * const ts = new TreeSet<number>([1, 2, 3]);
339
+ * const sum = ts.reduce((acc, k) => acc + k, 0);
340
+ * console.log(sum); // 6;
2527
341
  */
2528
342
  reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
2529
343
  let acc = initialValue;
@@ -2535,193 +349,23 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
2535
349
  /**
2536
350
  * Test whether all values satisfy a predicate.
2537
351
  * @remarks Time O(n), Space O(1)
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
-
2592
-
2593
-
2594
-
2595
-
2596
-
2597
-
2598
-
2599
-
2600
-
2601
-
2602
-
2603
-
2604
-
2605
-
2606
-
2607
-
2608
-
2609
-
2610
-
2611
-
2612
-
2613
-
2614
-
2615
-
2616
-
2617
-
2618
-
2619
-
2620
-
2621
-
2622
-
2623
-
2624
-
2625
-
2626
-
2627
-
2628
-
2629
-
2630
-
2631
-
2632
-
2633
-
2634
-
2635
-
2636
-
2637
-
2638
-
2639
-
2640
-
2641
-
2642
-
2643
-
2644
-
2645
-
2646
-
2647
-
2648
-
2649
-
2650
-
2651
-
2652
-
2653
-
2654
-
2655
-
2656
-
2657
-
2658
-
2659
-
2660
-
2661
-
2662
-
2663
-
2664
-
2665
-
2666
-
2667
-
2668
-
2669
-
2670
-
2671
-
2672
-
2673
-
2674
-
2675
-
2676
-
2677
-
2678
-
2679
-
2680
-
2681
-
2682
-
2683
-
2684
-
2685
-
2686
-
2687
-
2688
-
2689
-
2690
-
2691
-
2692
-
2693
-
2694
-
2695
-
2696
-
2697
-
2698
-
2699
-
2700
-
2701
-
2702
-
2703
-
2704
-
2705
-
2706
-
2707
-
2708
-
2709
-
2710
-
2711
-
2712
-
2713
-
2714
- * @example
2715
- * // Test all
2716
- * const ts = new TreeSet<number>([2, 4, 6]);
2717
- * console.log(ts.every(k => k > 0)); // true;
352
+ * @example
353
+ * // Test all
354
+ * const ts = new TreeSet<number>([2, 4, 6]);
355
+ * console.log(ts.every(k => k > 0)); // true;
2718
356
  */
2719
357
  every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
2720
358
  let index = 0;
2721
359
  for (const v of this) {
2722
- const ok = thisArg === undefined
2723
- ? callbackfn(v, index++, this)
2724
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
360
+ const ok =
361
+ thisArg === undefined
362
+ ? callbackfn(v, index++, this)
363
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(
364
+ thisArg,
365
+ v,
366
+ index++,
367
+ this
368
+ );
2725
369
  if (!ok) return false;
2726
370
  }
2727
371
  return true;
@@ -2730,193 +374,23 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
2730
374
  /**
2731
375
  * Test whether any value satisfies a predicate.
2732
376
  * @remarks Time O(n), Space O(1)
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
-
2889
-
2890
-
2891
-
2892
-
2893
-
2894
-
2895
-
2896
-
2897
-
2898
-
2899
-
2900
-
2901
-
2902
-
2903
-
2904
-
2905
-
2906
-
2907
-
2908
-
2909
- * @example
2910
- * // Test any
2911
- * const ts = new TreeSet<number>([1, 3, 5]);
2912
- * console.log(ts.some(k => k === 3)); // true;
377
+ * @example
378
+ * // Test any
379
+ * const ts = new TreeSet<number>([1, 3, 5]);
380
+ * console.log(ts.some(k => k === 3)); // true;
2913
381
  */
2914
382
  some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
2915
383
  let index = 0;
2916
384
  for (const v of this) {
2917
- const ok = thisArg === undefined
2918
- ? callbackfn(v, index++, this)
2919
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
385
+ const ok =
386
+ thisArg === undefined
387
+ ? callbackfn(v, index++, this)
388
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(
389
+ thisArg,
390
+ v,
391
+ index++,
392
+ this
393
+ );
2920
394
  if (ok) return true;
2921
395
  }
2922
396
  return false;
@@ -2925,194 +399,24 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
2925
399
  /**
2926
400
  * Find the first value that satisfies a predicate.
2927
401
  * @remarks Time O(n), Space O(1)
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
-
3089
-
3090
-
3091
-
3092
-
3093
-
3094
-
3095
-
3096
-
3097
-
3098
-
3099
-
3100
-
3101
-
3102
-
3103
-
3104
- * @example
3105
- * // Find entry
3106
- * const ts = new TreeSet<number>([1, 2, 3]);
3107
- * const found = ts.find(k => k === 2);
3108
- * console.log(found); // 2;
402
+ * @example
403
+ * // Find entry
404
+ * const ts = new TreeSet<number>([1, 2, 3]);
405
+ * const found = ts.find(k => k === 2);
406
+ * console.log(found); // 2;
3109
407
  */
3110
408
  find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
3111
409
  let index = 0;
3112
410
  for (const v of this) {
3113
- const ok = thisArg === undefined
3114
- ? callbackfn(v, index++, this)
3115
- : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
411
+ const ok =
412
+ thisArg === undefined
413
+ ? callbackfn(v, index++, this)
414
+ : (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(
415
+ thisArg,
416
+ v,
417
+ index++,
418
+ this
419
+ );
3116
420
  if (ok) return v;
3117
421
  }
3118
422
  return undefined;
@@ -3121,188 +425,10 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
3121
425
  /**
3122
426
  * Materialize the set into an array of keys.
3123
427
  * @remarks Time O(n), Space O(n)
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
-
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
- * @example
3303
- * // Convert to array
3304
- * const ts = new TreeSet<number>([3, 1, 2]);
3305
- * console.log(ts.toArray()); // [1, 2, 3];
428
+ * @example
429
+ * // Convert to array
430
+ * const ts = new TreeSet<number>([3, 1, 2]);
431
+ * console.log(ts.toArray()); // [1, 2, 3];
3306
432
  */
3307
433
  toArray(): K[] {
3308
434
  return [...this];
@@ -3311,315 +437,59 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
3311
437
  /**
3312
438
  * Print a human-friendly representation.
3313
439
  * @remarks Time O(n), Space O(n)
3314
-
3315
-
3316
-
3317
-
3318
-
3319
-
3320
-
3321
-
3322
-
3323
-
3324
-
3325
-
3326
-
3327
-
3328
-
3329
-
3330
-
3331
-
3332
-
3333
-
3334
-
3335
-
3336
-
3337
-
3338
-
3339
-
3340
-
3341
-
3342
-
3343
-
3344
-
3345
-
3346
-
3347
-
3348
-
3349
-
3350
-
3351
-
3352
-
3353
-
3354
-
3355
-
3356
-
3357
-
3358
-
3359
-
3360
-
3361
-
3362
-
3363
-
3364
-
3365
-
3366
-
3367
-
3368
-
3369
-
3370
-
3371
-
3372
-
3373
-
3374
-
3375
-
3376
-
3377
-
3378
-
3379
-
3380
-
3381
-
3382
-
3383
-
3384
-
3385
-
3386
-
3387
-
3388
-
3389
-
3390
-
3391
-
3392
-
3393
-
3394
-
3395
-
3396
-
3397
-
3398
-
3399
-
3400
-
3401
-
3402
-
3403
-
3404
-
3405
-
3406
-
3407
-
3408
-
3409
-
3410
-
3411
-
3412
-
3413
-
3414
-
3415
-
3416
-
3417
-
3418
-
3419
-
3420
-
3421
-
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
-
3486
-
3487
-
3488
-
3489
-
3490
-
3491
-
3492
- * @example
3493
- * // Display tree
3494
- * const ts = new TreeSet<number>([1, 2, 3]);
3495
- * expect(() => ts.print()).not.toThrow();
440
+ * @example
441
+ * // Display tree
442
+ * const ts = new TreeSet<number>([1, 2, 3]);
443
+ * expect(() => ts.print()).not.toThrow();
3496
444
  */
3497
445
  print(): void {
3498
446
  // Delegate to the underlying tree's visualization.
3499
447
  this.#core.print();
3500
448
  }
3501
449
 
3502
- // Navigable operations
3503
-
3504
450
  /**
3505
451
  * Smallest key in the set.
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
- * @example
3546
- * // Student grade ranking with custom comparator
3547
- * interface Student {
3548
- * name: string;
3549
- * gpa: number;
3550
- * }
3551
- *
3552
- * const ranking = new TreeSet<Student>(
3553
- * [
3554
- * { name: 'Alice', gpa: 3.8 },
3555
- * { name: 'Bob', gpa: 3.5 },
3556
- * { name: 'Charlie', gpa: 3.9 },
3557
- * { name: 'Diana', gpa: 3.5 }
3558
- * ],
3559
- * { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
3560
- * );
3561
- *
3562
- * // Sorted by GPA descending, then name ascending
3563
- * const names = [...ranking].map(s => s.name);
3564
- * console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
3565
- *
3566
- * // Top student
3567
- * console.log(ranking.first()?.name); // 'Charlie';
3568
- *
3569
- * // Filter students with GPA >= 3.8
3570
- * const honors = ranking.filter(s => s.gpa >= 3.8);
3571
- * console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
452
+ * @example
453
+ * // Student grade ranking with custom comparator
454
+ * interface Student {
455
+ * name: string;
456
+ * gpa: number;
457
+ * }
458
+ *
459
+ * const ranking = new TreeSet<Student>(
460
+ * [
461
+ * { name: 'Alice', gpa: 3.8 },
462
+ * { name: 'Bob', gpa: 3.5 },
463
+ * { name: 'Charlie', gpa: 3.9 },
464
+ * { name: 'Diana', gpa: 3.5 }
465
+ * ],
466
+ * { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
467
+ * );
468
+ *
469
+ * // Sorted by GPA descending, then name ascending
470
+ * const names = [...ranking].map(s => s.name);
471
+ * console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
472
+ *
473
+ * // Top student
474
+ * console.log(ranking.first()?.name); // 'Charlie';
475
+ *
476
+ * // Filter students with GPA >= 3.8
477
+ * const honors = ranking.filter(s => s.gpa >= 3.8);
478
+ * console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
3572
479
  */
3573
480
  first(): K | undefined {
3574
481
  return this.#core.getLeftMost();
3575
482
  }
3576
483
 
484
+ // Navigable operations
485
+
3577
486
  /**
3578
487
  * Largest key in the set.
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
- * @example
3619
- * // Get the maximum element
3620
- * const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
3621
- * console.log(temps.last()); // 30;
3622
- * console.log(temps.first()); // 15;
488
+ * @example
489
+ * // Get the maximum element
490
+ * const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
491
+ * console.log(temps.last()); // 30;
492
+ * console.log(temps.first()); // 15;
3623
493
  */
3624
494
  last(): K | undefined {
3625
495
  return this.#core.getRightMost();
@@ -3627,52 +497,13 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
3627
497
 
3628
498
  /**
3629
499
  * Remove and return the smallest key.
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
- * @example
3670
- * // Remove and return minimum
3671
- * const queue = new TreeSet<number>([5, 1, 8, 3]);
3672
- *
3673
- * console.log(queue.pollFirst()); // 1;
3674
- * console.log(queue.pollFirst()); // 3;
3675
- * console.log(queue.size); // 2;
500
+ * @example
501
+ * // Remove and return minimum
502
+ * const queue = new TreeSet<number>([5, 1, 8, 3]);
503
+ *
504
+ * console.log(queue.pollFirst()); // 1;
505
+ * console.log(queue.pollFirst()); // 3;
506
+ * console.log(queue.size); // 2;
3676
507
  */
3677
508
  pollFirst(): K | undefined {
3678
509
  const k = this.first();
@@ -3683,51 +514,12 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
3683
514
 
3684
515
  /**
3685
516
  * Remove and return the largest key.
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
- * @example
3726
- * // Remove and return maximum
3727
- * const stack = new TreeSet<number>([10, 20, 30]);
3728
- *
3729
- * console.log(stack.pollLast()); // 30;
3730
- * console.log(stack.size); // 2;
517
+ * @example
518
+ * // Remove and return maximum
519
+ * const stack = new TreeSet<number>([10, 20, 30]);
520
+ *
521
+ * console.log(stack.pollLast()); // 30;
522
+ * console.log(stack.size); // 2;
3731
523
  */
3732
524
  pollLast(): K | undefined {
3733
525
  const k = this.last();
@@ -3738,172 +530,22 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
3738
530
 
3739
531
  /**
3740
532
  * Smallest key that is >= the given key.
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
-
3803
-
3804
-
3805
-
3806
-
3807
-
3808
-
3809
-
3810
-
3811
-
3812
-
3813
-
3814
-
3815
-
3816
-
3817
-
3818
-
3819
-
3820
-
3821
-
3822
-
3823
-
3824
-
3825
-
3826
-
3827
-
3828
-
3829
-
3830
-
3831
-
3832
-
3833
-
3834
-
3835
-
3836
-
3837
-
3838
-
3839
-
3840
-
3841
-
3842
-
3843
-
3844
-
3845
-
3846
-
3847
-
3848
-
3849
-
3850
-
3851
-
3852
-
3853
-
3854
-
3855
-
3856
-
3857
-
3858
-
3859
-
3860
-
3861
-
3862
-
3863
-
3864
-
3865
-
3866
-
3867
-
3868
-
3869
-
3870
-
3871
-
3872
-
3873
-
3874
-
3875
-
3876
-
3877
-
3878
-
3879
-
3880
-
3881
-
3882
-
3883
-
3884
-
3885
-
3886
-
3887
-
3888
-
3889
-
3890
-
3891
- * @example
3892
- * // Finding nearest available time slot
3893
- * // Available appointment times (minutes from midnight)
3894
- * const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
3895
- *
3896
- * // Customer wants something around 10:30 (630 min)
3897
- * const nearest = slots.ceiling(630);
3898
- * console.log(nearest); // 660; // 11:00 AM
3899
- *
3900
- * // What's the latest slot before 2:00 PM (840)?
3901
- * const before2pm = slots.lower(840);
3902
- * console.log(before2pm); // 720; // 12:00 PM
3903
- *
3904
- * // Book the 11:00 slot
3905
- * slots.delete(660);
3906
- * console.log(slots.ceiling(630)); // 720;
533
+ * @example
534
+ * // Finding nearest available time slot
535
+ * // Available appointment times (minutes from midnight)
536
+ * const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
537
+ *
538
+ * // Customer wants something around 10:30 (630 min)
539
+ * const nearest = slots.ceiling(630);
540
+ * console.log(nearest); // 660; // 11:00 AM
541
+ *
542
+ * // What's the latest slot before 2:00 PM (840)?
543
+ * const before2pm = slots.lower(840);
544
+ * console.log(before2pm); // 720; // 12:00 PM
545
+ *
546
+ * // Book the 11:00 slot
547
+ * slots.delete(660);
548
+ * console.log(slots.ceiling(630)); // 720;
3907
549
  */
3908
550
  ceiling(key: K): K | undefined {
3909
551
  this._validateKey(key);
@@ -3912,164 +554,14 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
3912
554
 
3913
555
  /**
3914
556
  * Largest key that is <= the given key.
3915
-
3916
-
3917
-
3918
-
3919
-
3920
-
3921
-
3922
-
3923
-
3924
-
3925
-
3926
-
3927
-
3928
-
3929
-
3930
-
3931
-
3932
-
3933
-
3934
-
3935
-
3936
-
3937
-
3938
-
3939
-
3940
-
3941
-
3942
-
3943
-
3944
-
3945
-
3946
-
3947
-
3948
-
3949
-
3950
-
3951
-
3952
-
3953
-
3954
-
3955
-
3956
-
3957
-
3958
-
3959
-
3960
-
3961
-
3962
-
3963
-
3964
-
3965
-
3966
-
3967
-
3968
-
3969
-
3970
-
3971
-
3972
-
3973
-
3974
-
3975
-
3976
-
3977
-
3978
-
3979
-
3980
-
3981
-
3982
-
3983
-
3984
-
3985
-
3986
-
3987
-
3988
-
3989
-
3990
-
3991
-
3992
-
3993
-
3994
-
3995
-
3996
-
3997
-
3998
-
3999
-
4000
-
4001
-
4002
-
4003
-
4004
-
4005
-
4006
-
4007
-
4008
-
4009
-
4010
-
4011
-
4012
-
4013
-
4014
-
4015
-
4016
-
4017
-
4018
-
4019
-
4020
-
4021
-
4022
-
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
- * @example
4066
- * // Largest element ≤ target
4067
- * const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
4068
- *
4069
- * // Current width is 800 → which breakpoint applies?
4070
- * console.log(breakpoints.floor(800)); // 768;
4071
- * console.log(breakpoints.floor(1024)); // 1024; // exact match
4072
- * console.log(breakpoints.floor(100)); // undefined;
557
+ * @example
558
+ * // Largest element ≤ target
559
+ * const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
560
+ *
561
+ * // Current width is 800 → which breakpoint applies?
562
+ * console.log(breakpoints.floor(800)); // 768;
563
+ * console.log(breakpoints.floor(1024)); // 1024; // exact match
564
+ * console.log(breakpoints.floor(100)); // undefined;
4073
565
  */
4074
566
  floor(key: K): K | undefined {
4075
567
  this._validateKey(key);
@@ -4078,162 +570,12 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
4078
570
 
4079
571
  /**
4080
572
  * Smallest key that is > the given key.
4081
-
4082
-
4083
-
4084
-
4085
-
4086
-
4087
-
4088
-
4089
-
4090
-
4091
-
4092
-
4093
-
4094
-
4095
-
4096
-
4097
-
4098
-
4099
-
4100
-
4101
-
4102
-
4103
-
4104
-
4105
-
4106
-
4107
-
4108
-
4109
-
4110
-
4111
-
4112
-
4113
-
4114
-
4115
-
4116
-
4117
-
4118
-
4119
-
4120
-
4121
-
4122
-
4123
-
4124
-
4125
-
4126
-
4127
-
4128
-
4129
-
4130
-
4131
-
4132
-
4133
-
4134
-
4135
-
4136
-
4137
-
4138
-
4139
-
4140
-
4141
-
4142
-
4143
-
4144
-
4145
-
4146
-
4147
-
4148
-
4149
-
4150
-
4151
-
4152
-
4153
-
4154
-
4155
-
4156
-
4157
-
4158
-
4159
-
4160
-
4161
-
4162
-
4163
-
4164
-
4165
-
4166
-
4167
-
4168
-
4169
-
4170
-
4171
-
4172
-
4173
-
4174
-
4175
-
4176
-
4177
-
4178
-
4179
-
4180
-
4181
-
4182
-
4183
-
4184
-
4185
-
4186
-
4187
-
4188
-
4189
-
4190
-
4191
-
4192
-
4193
-
4194
-
4195
-
4196
-
4197
-
4198
-
4199
-
4200
-
4201
-
4202
-
4203
-
4204
-
4205
-
4206
-
4207
-
4208
-
4209
-
4210
-
4211
-
4212
-
4213
-
4214
-
4215
-
4216
-
4217
-
4218
-
4219
-
4220
-
4221
-
4222
-
4223
-
4224
-
4225
-
4226
-
4227
-
4228
-
4229
-
4230
-
4231
- * @example
4232
- * // Smallest element strictly > target
4233
- * const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
4234
- *
4235
- * console.log(levels.higher(10)); // 25;
4236
- * console.log(levels.higher(100)); // undefined;
573
+ * @example
574
+ * // Smallest element strictly > target
575
+ * const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
576
+ *
577
+ * console.log(levels.higher(10)); // 25;
578
+ * console.log(levels.higher(100)); // undefined;
4237
579
  */
4238
580
  higher(key: K): K | undefined {
4239
581
  this._validateKey(key);
@@ -4242,162 +584,12 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
4242
584
 
4243
585
  /**
4244
586
  * Largest key that is < the given key.
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
-
4391
-
4392
-
4393
-
4394
-
4395
- * @example
4396
- * // Largest element strictly < target
4397
- * const tiers = new TreeSet<number>([100, 200, 500, 1000]);
4398
- *
4399
- * console.log(tiers.lower(500)); // 200;
4400
- * console.log(tiers.lower(100)); // undefined;
587
+ * @example
588
+ * // Largest element strictly < target
589
+ * const tiers = new TreeSet<number>([100, 200, 500, 1000]);
590
+ *
591
+ * console.log(tiers.lower(500)); // 200;
592
+ * console.log(tiers.lower(100)); // undefined;
4401
593
  */
4402
594
  lower(key: K): K | undefined {
4403
595
  this._validateKey(key);
@@ -4409,227 +601,71 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
4409
601
  *
4410
602
  * @param range `[low, high]`
4411
603
  * @param options Inclusive/exclusive bounds (defaults to inclusive).
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
- * @example
4563
- * // IP address blocklist with range checking
4564
- * // Simplified: use numeric IP representation
4565
- * const blocklist = new TreeSet<number>([
4566
- * 167772160, // 10.0.0.0
4567
- * 167772416, // 10.0.1.0
4568
- * 167772672, // 10.0.2.0
4569
- * 167773184 // 10.0.4.0
4570
- * ]);
4571
- *
4572
- * // Check if any blocked IP is in range 10.0.1.0 - 10.0.3.0
4573
- * const inRange = blocklist.rangeSearch([167772416, 167772928]);
4574
- * console.log(inRange); // [167772416, 167772672];
4575
- *
4576
- * // Quick membership check
4577
- * console.log(blocklist.has(167772416)); // true;
4578
- * console.log(blocklist.has(167772800)); // false;
604
+ * @example
605
+ * // IP address blocklist with range checking
606
+ * // Simplified: use numeric IP representation
607
+ * const blocklist = new TreeSet<number>([
608
+ * 167772160, // 10.0.0.0
609
+ * 167772416, // 10.0.1.0
610
+ * 167772672, // 10.0.2.0
611
+ * 167773184 // 10.0.4.0
612
+ * ]);
613
+ *
614
+ * // Check if any blocked IP is in range 10.0.1.0 - 10.0.3.0
615
+ * const inRange = blocklist.rangeSearch([167772416, 167772928]);
616
+ * console.log(inRange); // [167772416, 167772672];
617
+ *
618
+ * // Quick membership check
619
+ * console.log(blocklist.has(167772416)); // true;
620
+ * console.log(blocklist.has(167772800)); // false;
4579
621
  */
4580
622
  rangeSearch(range: [K, K], options: TreeSetRangeOptions = {}): K[] {
4581
623
  const { lowInclusive = true, highInclusive = true } = options;
4582
-
4583
624
  const [low, high] = range;
4584
625
  this._validateKey(low);
4585
626
  this._validateKey(high);
4586
-
4587
627
  const keys = this.#core.rangeSearch([low, high]) as (K | undefined)[];
4588
628
  const out: K[] = [];
4589
629
  const cmp = this.#core.comparator;
4590
-
4591
630
  for (const k of keys) {
4592
- /* istanbul ignore next -- defensive: tree keys are never undefined */ if (k === undefined) continue;
631
+ /* istanbul ignore next -- defensive: tree keys are never undefined */
632
+ if (k === undefined) continue;
4593
633
  if (!lowInclusive && cmp(k, low) === 0) continue;
4594
634
  if (!highInclusive && cmp(k, high) === 0) continue;
4595
635
  out.push(k);
4596
636
  }
4597
-
4598
637
  return out;
4599
638
  }
4600
639
 
4601
- // ─── Order-Statistic Methods ───────────────────────────
4602
-
4603
640
  /**
4604
641
  * Returns the element at the k-th position in tree order (0-indexed).
4605
642
  * @remarks Time O(log n). Requires `enableOrderStatistic: true`.
4606
-
4607
-
4608
-
4609
- * @example
4610
- * // Find k-th element in a TreeSet
4611
- * const set = new TreeSet<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
4612
- * console.log(set.getByRank(0)); // 10;
4613
- * console.log(set.getByRank(2)); // 30;
4614
- * console.log(set.getRank(30)); // 2;
643
+ * @example
644
+ * // Find k-th element in a TreeSet
645
+ * const set = new TreeSet<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
646
+ * console.log(set.getByRank(0)); // 10;
647
+ * console.log(set.getByRank(2)); // 30;
648
+ * console.log(set.getRank(30)); // 2;
4615
649
  */
4616
650
  getByRank(k: number): K | undefined {
4617
651
  return this.#core.getByRank(k);
4618
652
  }
4619
653
 
654
+ // ─── Order-Statistic Methods ───────────────────────────
655
+
4620
656
  /**
4621
657
  * Returns the 0-based rank of a key (number of elements that precede it in tree order).
4622
658
  * @remarks Time O(log n). Requires `enableOrderStatistic: true`.
4623
- * @example
4624
- * // Get the rank of a key in sorted order
4625
- * const tree = new TreeSet<number>(
4626
- * [10, 20, 30, 40, 50],
4627
- * { enableOrderStatistic: true }
4628
- * );
4629
- * console.log(tree.getRank(10)); // 0; // smallest → rank 0
4630
- * console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
4631
- * console.log(tree.getRank(50)); // 4; // largest → rank 4
4632
- * console.log(tree.getRank(25)); // 2;
659
+ * @example
660
+ * // Get the rank of a key in sorted order
661
+ * const tree = new TreeSet<number>(
662
+ * [10, 20, 30, 40, 50],
663
+ * { enableOrderStatistic: true }
664
+ * );
665
+ * console.log(tree.getRank(10)); // 0; // smallest → rank 0
666
+ * console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
667
+ * console.log(tree.getRank(50)); // 4; // largest → rank 4
668
+ * console.log(tree.getRank(25)); // 2;
4633
669
  */
4634
670
  getRank(key: K): number {
4635
671
  return this.#core.getRank(key);
@@ -4638,222 +674,165 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
4638
674
  /**
4639
675
  * Returns elements by rank range (0-indexed, inclusive on both ends).
4640
676
  * @remarks Time O(log n + k). Requires `enableOrderStatistic: true`.
4641
-
4642
-
4643
-
4644
-
4645
-
4646
-
4647
-
4648
-
4649
-
4650
- * @example
4651
- * // Pagination by position in tree order
4652
- * const tree = new TreeSet<number>(
4653
- * [10, 20, 30, 40, 50, 60, 70, 80, 90],
4654
- * { enableOrderStatistic: true }
4655
- * );
4656
- * const pageSize = 3;
4657
- *
4658
- * // Page 1
4659
- * console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
4660
- * // Page 2
4661
- * console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
4662
- * // Page 3
4663
- * console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
677
+ * @example
678
+ * // Pagination by position in tree order
679
+ * const tree = new TreeSet<number>([10, 20, 30, 40, 50, 60, 70, 80, 90], { enableOrderStatistic: true });
680
+ * const pageSize = 3;
681
+ *
682
+ * // Page 1
683
+ * console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
684
+ * // Page 2
685
+ * console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
686
+ * // Page 3
687
+ * console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
4664
688
  */
4665
689
  rangeByRank(start: number, end: number): K[] {
4666
690
  return this.#core.rangeByRank(start, end).filter((k): k is K => k !== undefined);
4667
691
  }
4668
692
 
693
+ /**
694
+ * Return a new TreeSet containing all elements from both sets.
695
+ * @remarks When both sets share the same comparator, uses O(n+m) merge. Otherwise O(m log n).
696
+ * @param other - Any iterable of keys.
697
+ * @returns A new TreeSet.
698
+ * @example
699
+ * // Merge two sets
700
+ * console.log([...a.union(b)]); // [1, 2, 3, 4, 5, 6, 7];
701
+ */
702
+ union(other: Iterable<K>): TreeSet<K> {
703
+ const result = this.clone();
704
+ for (const key of other) result.add(key);
705
+ return result;
706
+ }
707
+
4669
708
  /**
4670
709
  * Creates a shallow clone of this set.
4671
710
  * @remarks Time O(n log n), Space O(n)
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
-
4740
-
4741
-
4742
-
4743
-
4744
-
4745
-
4746
-
4747
-
4748
-
4749
-
4750
-
4751
-
4752
-
4753
-
4754
-
4755
-
4756
-
4757
-
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
- * @example
4852
- * // Deep clone
4853
- * const ts = new TreeSet<number>([1, 2, 3]);
4854
- * const copy = ts.clone();
4855
- * copy.delete(1);
4856
- * console.log(ts.has(1)); // true;
711
+ * @example
712
+ * // Deep clone
713
+ * const ts = new TreeSet<number>([1, 2, 3]);
714
+ * const copy = ts.clone();
715
+ * copy.delete(1);
716
+ * console.log(ts.has(1)); // true;
717
+ */
718
+
719
+ // ---- ES2025 Set-like operations ----
720
+
721
+ /**
722
+ * Return a new TreeSet containing only elements present in both sets.
723
+ * @remarks Time O(n+m) with ordered merge when possible, otherwise O(n log m).
724
+ * @param other - Any iterable of keys (converted to Set for fast lookup if not a TreeSet).
725
+ * @returns A new TreeSet.
726
+ * @example
727
+ * // Find common elements
728
+ * console.log([...a.intersection(b)]); // [3, 4, 5];
729
+ */
730
+ intersection(other: Iterable<K>): TreeSet<K> {
731
+ const otherSet = other instanceof TreeSet || other instanceof Set ? other : new Set(other);
732
+ const result = new TreeSet<K>([], { comparator: this.#isDefaultComparator ? undefined : this.#userComparator });
733
+ for (const key of this) {
734
+ if (otherSet.has(key)) result.add(key);
735
+ }
736
+ return result;
737
+ }
738
+
739
+ /**
740
+ * Return a new TreeSet containing elements in this set but not in the other.
741
+ * @remarks Time O(n+m) with ordered merge when possible, otherwise O(n log m).
742
+ * @param other - Any iterable of keys.
743
+ * @returns A new TreeSet.
744
+ * @example
745
+ * // Find exclusive elements
746
+ * console.log([...a.difference(b)]); // [1, 2];
747
+ */
748
+ difference(other: Iterable<K>): TreeSet<K> {
749
+ const otherSet = other instanceof TreeSet || other instanceof Set ? other : new Set(other);
750
+ const result = new TreeSet<K>([], { comparator: this.#isDefaultComparator ? undefined : this.#userComparator });
751
+ for (const key of this) {
752
+ if (!otherSet.has(key)) result.add(key);
753
+ }
754
+ return result;
755
+ }
756
+
757
+ /**
758
+ * Return a new TreeSet containing elements in either set but not both.
759
+ * @remarks Time O(n+m).
760
+ * @param other - Any iterable of keys.
761
+ * @returns A new TreeSet.
762
+ * @example
763
+ * // Find symmetric difference
764
+ * console.log([...a.symmetricDifference(b)]); // [1, 2, 6, 7];
765
+ */
766
+ symmetricDifference(other: Iterable<K>): TreeSet<K> {
767
+ const otherSet = other instanceof TreeSet || other instanceof Set ? other : new Set(other);
768
+ const result = new TreeSet<K>([], { comparator: this.#isDefaultComparator ? undefined : this.#userComparator });
769
+ for (const key of this) {
770
+ if (!otherSet.has(key)) result.add(key);
771
+ }
772
+ for (const key of otherSet) {
773
+ if (!this.has(key)) result.add(key);
774
+ }
775
+ return result;
776
+ }
777
+
778
+ /**
779
+ * Check whether every element in this set is also in the other.
780
+ * @remarks Time O(n).
781
+ * @param other - Any iterable of keys (converted to Set for fast lookup if not a TreeSet).
782
+ * @returns `true` if this is a subset of other.
783
+ * @example
784
+ * // Check subset
785
+ * console.log(new TreeSet([3, 4]).isSubsetOf(a)); // true;
786
+ */
787
+ isSubsetOf(other: Iterable<K>): boolean {
788
+ const otherSet = other instanceof TreeSet || other instanceof Set ? other : new Set(other);
789
+ for (const key of this) {
790
+ if (!otherSet.has(key)) return false;
791
+ }
792
+ return true;
793
+ }
794
+
795
+ /**
796
+ * Check whether every element in the other set is also in this set.
797
+ * @remarks Time O(m).
798
+ * @param other - Any iterable of keys.
799
+ * @returns `true` if this is a superset of other.
800
+ * @example
801
+ * // Check superset
802
+ * console.log(a.isSupersetOf(new TreeSet([2, 3]))); // true;
803
+ */
804
+ isSupersetOf(other: Iterable<K>): boolean {
805
+ for (const key of other) {
806
+ if (!this.has(key)) return false;
807
+ }
808
+ return true;
809
+ }
810
+
811
+ /**
812
+ * Check whether this set and the other share no common elements.
813
+ * @remarks Time O(min(n,m)), can short-circuit on first overlap.
814
+ * @param other - Any iterable of keys (converted to Set for fast lookup if not a TreeSet).
815
+ * @returns `true` if sets are disjoint.
816
+ * @example
817
+ * // Check disjoint
818
+ * console.log(a.isDisjointFrom(new TreeSet([8, 9]))); // true;
819
+ */
820
+ isDisjointFrom(other: Iterable<K>): boolean {
821
+ const otherSet = other instanceof TreeSet || other instanceof Set ? other : new Set(other);
822
+ for (const key of this) {
823
+ if (otherSet.has(key)) return false;
824
+ }
825
+ return true;
826
+ }
827
+
828
+ /**
829
+ * Deep copy
830
+ * @example
831
+ * // Deep clone
832
+ * const ts = new TreeSet<number>([1, 2, 3]);
833
+ * const copy = ts.clone();
834
+ * copy.delete(1);
835
+ * console.log(ts.has(1)); // true;
4857
836
  */
4858
837
  clone(): TreeSet<K> {
4859
838
  return new TreeSet<K>(this, {
@@ -4861,4 +840,19 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
4861
840
  isMapMode: this.#core.isMapMode
4862
841
  });
4863
842
  }
843
+
844
+ private _validateKey(key: K): void {
845
+ if (!this.#isDefaultComparator) return;
846
+ if (typeof key === 'number') {
847
+ if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeSet'));
848
+ return;
849
+ }
850
+ if (typeof key === 'string') return;
851
+ if (key instanceof Date) {
852
+ if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeSet'));
853
+ return;
854
+ }
855
+ // Other key types should have provided a comparator, so reaching here means misuse.
856
+ raise(TypeError, ERR.comparatorRequired('TreeSet'));
857
+ }
4864
858
  }