graph-typed 2.5.0 → 2.5.2
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.
- package/dist/cjs/index.cjs +1314 -227
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +1297 -210
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +1314 -228
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +1297 -211
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/types/common/error.d.ts +9 -0
- package/dist/types/common/index.d.ts +1 -1
- package/dist/types/data-structures/base/index.d.ts +1 -0
- package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
- package/dist/types/data-structures/base/linear-base.d.ts +3 -3
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +288 -0
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +336 -0
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +618 -18
- package/dist/types/data-structures/binary-tree/bst.d.ts +676 -1
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +456 -0
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +144 -1
- package/dist/types/data-structures/binary-tree/tree-map.d.ts +3307 -399
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3285 -360
- package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2674 -325
- package/dist/types/data-structures/binary-tree/tree-set.d.ts +3072 -287
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/types/data-structures/graph/directed-graph.d.ts +240 -0
- package/dist/types/data-structures/graph/undirected-graph.d.ts +216 -0
- package/dist/types/data-structures/hash/hash-map.d.ts +274 -10
- package/dist/types/data-structures/heap/heap.d.ts +336 -0
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +411 -3
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +363 -3
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +434 -2
- package/dist/types/data-structures/matrix/matrix.d.ts +192 -0
- package/dist/types/data-structures/queue/deque.d.ts +364 -4
- package/dist/types/data-structures/queue/queue.d.ts +288 -0
- package/dist/types/data-structures/stack/stack.d.ts +240 -0
- package/dist/types/data-structures/trie/trie.d.ts +292 -4
- package/dist/types/interfaces/graph.d.ts +1 -1
- package/dist/types/types/common.d.ts +2 -2
- package/dist/types/types/data-structures/binary-tree/bst.d.ts +1 -0
- package/dist/types/types/data-structures/binary-tree/tree-map.d.ts +5 -0
- package/dist/types/types/data-structures/binary-tree/tree-multi-set.d.ts +4 -0
- package/dist/types/types/data-structures/binary-tree/tree-set.d.ts +4 -0
- package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
- package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
- package/dist/types/types/utils/validate-type.d.ts +4 -4
- package/dist/umd/graph-typed.js +1291 -205
- package/dist/umd/graph-typed.js.map +1 -1
- package/dist/umd/graph-typed.min.js +3 -3
- package/dist/umd/graph-typed.min.js.map +1 -1
- package/package.json +2 -2
- package/src/common/error.ts +19 -1
- package/src/common/index.ts +1 -1
- package/src/data-structures/base/index.ts +1 -0
- package/src/data-structures/base/iterable-element-base.ts +3 -2
- package/src/data-structures/base/iterable-entry-base.ts +8 -8
- package/src/data-structures/base/linear-base.ts +3 -3
- package/src/data-structures/binary-tree/avl-tree.ts +299 -0
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +341 -5
- package/src/data-structures/binary-tree/binary-tree.ts +606 -6
- package/src/data-structures/binary-tree/bst.ts +946 -7
- package/src/data-structures/binary-tree/red-black-tree.ts +472 -0
- package/src/data-structures/binary-tree/segment-tree.ts +145 -2
- package/src/data-structures/binary-tree/tree-map.ts +3423 -499
- package/src/data-structures/binary-tree/tree-multi-map.ts +3537 -596
- package/src/data-structures/binary-tree/tree-multi-set.ts +2855 -495
- package/src/data-structures/binary-tree/tree-set.ts +3209 -413
- package/src/data-structures/graph/abstract-graph.ts +6 -6
- package/src/data-structures/graph/directed-graph.ts +240 -0
- package/src/data-structures/graph/undirected-graph.ts +216 -0
- package/src/data-structures/hash/hash-map.ts +281 -19
- package/src/data-structures/heap/heap.ts +340 -4
- package/src/data-structures/heap/max-heap.ts +2 -2
- package/src/data-structures/linked-list/doubly-linked-list.ts +411 -3
- package/src/data-structures/linked-list/singly-linked-list.ts +363 -3
- package/src/data-structures/linked-list/skip-linked-list.ts +439 -7
- package/src/data-structures/matrix/matrix.ts +202 -10
- package/src/data-structures/priority-queue/max-priority-queue.ts +2 -2
- package/src/data-structures/queue/deque.ts +365 -5
- package/src/data-structures/queue/queue.ts +288 -0
- package/src/data-structures/stack/stack.ts +240 -0
- package/src/data-structures/trie/trie.ts +295 -7
- package/src/interfaces/graph.ts +1 -1
- package/src/types/common.ts +2 -2
- package/src/types/data-structures/binary-tree/bst.ts +1 -0
- package/src/types/data-structures/binary-tree/tree-map.ts +6 -0
- package/src/types/data-structures/binary-tree/tree-multi-set.ts +5 -0
- package/src/types/data-structures/binary-tree/tree-set.ts +5 -0
- package/src/types/data-structures/heap/heap.ts +1 -0
- package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
- package/src/types/utils/validate-type.ts +4 -4
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import type { Comparator } from '../../types';
|
|
11
11
|
import type { TreeSetElementCallback, TreeSetOptions, TreeSetRangeOptions, TreeSetReduceCallback } from '../../types';
|
|
12
|
-
import { ERR } from '../../common';
|
|
12
|
+
import { ERR, raise } from '../../common';
|
|
13
13
|
import { RedBlackTree } from './red-black-tree';
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -50,7 +50,7 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
50
50
|
this.#isDefaultComparator = options.comparator === undefined;
|
|
51
51
|
|
|
52
52
|
// 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 });
|
|
53
|
+
this.#core = new RedBlackTree<K, undefined>([], { comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
|
|
54
54
|
|
|
55
55
|
for (const item of elements) {
|
|
56
56
|
const k = toElementFn ? toElementFn(item as R) : item as K;
|
|
@@ -73,7 +73,7 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
73
73
|
// numbers
|
|
74
74
|
if (typeof a === 'number' && typeof b === 'number') {
|
|
75
75
|
/* istanbul ignore next -- _validateKey prevents NaN from entering the tree */
|
|
76
|
-
if (Number.isNaN(a) || Number.isNaN(b))
|
|
76
|
+
if (Number.isNaN(a) || Number.isNaN(b)) raise(TypeError, ERR.invalidNaN('TreeSet'));
|
|
77
77
|
const aa = Object.is(a, -0) ? 0 : a;
|
|
78
78
|
const bb = Object.is(b, -0) ? 0 : b;
|
|
79
79
|
return aa > bb ? 1 : aa < bb ? -1 : 0;
|
|
@@ -87,11 +87,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
87
87
|
const ta = a.getTime();
|
|
88
88
|
const tb = b.getTime();
|
|
89
89
|
/* istanbul ignore next -- _validateKey prevents invalid Date from entering the tree */
|
|
90
|
-
if (Number.isNaN(ta) || Number.isNaN(tb))
|
|
90
|
+
if (Number.isNaN(ta) || Number.isNaN(tb)) raise(TypeError, ERR.invalidDate('TreeSet'));
|
|
91
91
|
return ta > tb ? 1 : ta < tb ? -1 : 0;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
raise(TypeError, ERR.comparatorRequired('TreeSet'));
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -142,36 +142,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
|
|
145
|
-
* @example
|
|
146
|
-
* // Check empty
|
|
147
|
-
* console.log(new TreeSet().isEmpty()); // true;
|
|
148
|
-
*/
|
|
149
|
-
isEmpty(): boolean {
|
|
150
|
-
return this.size === 0;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
private _validateKey(key: K): void {
|
|
154
|
-
if (!this.#isDefaultComparator) return;
|
|
155
|
-
|
|
156
|
-
if (typeof key === 'number') {
|
|
157
|
-
if (Number.isNaN(key)) throw new TypeError(ERR.invalidNaN('TreeSet'));
|
|
158
|
-
return;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
if (typeof key === 'string') return;
|
|
162
|
-
|
|
163
|
-
if (key instanceof Date) {
|
|
164
|
-
if (Number.isNaN(key.getTime())) throw new TypeError(ERR.invalidDate('TreeSet'));
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Other key types should have provided a comparator, so reaching here means misuse.
|
|
169
|
-
throw new TypeError(ERR.comparatorRequired('TreeSet'));
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Add a key to the set (no-op if already present).
|
|
174
|
-
* @remarks Expected time O(log n)
|
|
175
145
|
|
|
176
146
|
|
|
177
147
|
|
|
@@ -213,28 +183,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
213
183
|
|
|
214
184
|
|
|
215
185
|
|
|
216
|
-
* @example
|
|
217
|
-
* // Unique tags with sorted order
|
|
218
|
-
* const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
|
|
219
|
-
*
|
|
220
|
-
* // Duplicates removed, sorted alphabetically
|
|
221
|
-
* console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
|
|
222
|
-
* console.log(tags.size); // 4;
|
|
223
|
-
*
|
|
224
|
-
* tags.add('angular');
|
|
225
|
-
* console.log(tags.first()); // 'angular';
|
|
226
|
-
* console.log(tags.last()); // 'typescript';
|
|
227
|
-
*/
|
|
228
|
-
add(key: K): this {
|
|
229
|
-
this._validateKey(key);
|
|
230
|
-
// RBT.set returns boolean; Set.add returns this.
|
|
231
|
-
this.#core.set(key, undefined);
|
|
232
|
-
return this;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Test whether a key exists.
|
|
237
|
-
* @remarks Expected time O(log n)
|
|
238
186
|
|
|
239
187
|
|
|
240
188
|
|
|
@@ -284,22 +232,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
284
232
|
|
|
285
233
|
|
|
286
234
|
|
|
287
|
-
* @example
|
|
288
|
-
* // Checking membership in a sorted collection
|
|
289
|
-
* const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
|
|
290
|
-
*
|
|
291
|
-
* console.log(allowed.has('admin')); // true;
|
|
292
|
-
* console.log(allowed.has('guest')); // false;
|
|
293
|
-
*/
|
|
294
|
-
has(key: K): boolean {
|
|
295
|
-
this._validateKey(key);
|
|
296
|
-
return this.#core.has(key);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/**
|
|
300
|
-
* Delete a key.
|
|
301
|
-
* @returns `true` if the key existed; otherwise `false`.
|
|
302
|
-
* @remarks Expected time O(log n)
|
|
303
235
|
|
|
304
236
|
|
|
305
237
|
|
|
@@ -330,6 +262,36 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
330
262
|
|
|
331
263
|
|
|
332
264
|
|
|
265
|
+
* @example
|
|
266
|
+
* // Check empty
|
|
267
|
+
* console.log(new TreeSet().isEmpty()); // true;
|
|
268
|
+
*/
|
|
269
|
+
isEmpty(): boolean {
|
|
270
|
+
return this.size === 0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private _validateKey(key: K): void {
|
|
274
|
+
if (!this.#isDefaultComparator) return;
|
|
275
|
+
|
|
276
|
+
if (typeof key === 'number') {
|
|
277
|
+
if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeSet'));
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (typeof key === 'string') return;
|
|
282
|
+
|
|
283
|
+
if (key instanceof Date) {
|
|
284
|
+
if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeSet'));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Other key types should have provided a comparator, so reaching here means misuse.
|
|
289
|
+
raise(TypeError, ERR.comparatorRequired('TreeSet'));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Add a key to the set (no-op if already present).
|
|
294
|
+
* @remarks Expected time O(log n)
|
|
333
295
|
|
|
334
296
|
|
|
335
297
|
|
|
@@ -349,22 +311,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
349
311
|
|
|
350
312
|
|
|
351
313
|
|
|
352
|
-
* @example
|
|
353
|
-
* // Removing elements while maintaining order
|
|
354
|
-
* const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
|
|
355
|
-
*
|
|
356
|
-
* console.log(nums.delete(5)); // true;
|
|
357
|
-
* console.log(nums.delete(5)); // false; // already gone
|
|
358
|
-
* console.log([...nums]); // [1, 3, 7, 9];
|
|
359
|
-
*/
|
|
360
|
-
delete(key: K): boolean {
|
|
361
|
-
this._validateKey(key);
|
|
362
|
-
const res = this.#core.delete(key);
|
|
363
|
-
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Remove all keys.
|
|
368
314
|
|
|
369
315
|
|
|
370
316
|
|
|
@@ -403,18 +349,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
403
349
|
|
|
404
350
|
|
|
405
351
|
|
|
406
|
-
* @example
|
|
407
|
-
* // Remove all
|
|
408
|
-
* const ts = new TreeSet<number>([1, 2]);
|
|
409
|
-
* ts.clear();
|
|
410
|
-
* console.log(ts.isEmpty()); // true;
|
|
411
|
-
*/
|
|
412
|
-
clear(): void {
|
|
413
|
-
this.#core.clear();
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
/**
|
|
417
|
-
* Iterate over keys in ascending order.
|
|
418
352
|
|
|
419
353
|
|
|
420
354
|
|
|
@@ -453,19 +387,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
453
387
|
|
|
454
388
|
|
|
455
389
|
|
|
456
|
-
* @example
|
|
457
|
-
* // Get sorted keys
|
|
458
|
-
* const ts = new TreeSet<number>([30, 10, 20]);
|
|
459
|
-
* console.log([...ts.keys()]); // [10, 20, 30];
|
|
460
|
-
*/
|
|
461
|
-
keys(): IterableIterator<K> {
|
|
462
|
-
return this.#core.keys();
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/**
|
|
466
|
-
* Iterate over values in ascending order.
|
|
467
|
-
*
|
|
468
|
-
* Note: for Set-like containers, `values()` is the same as `keys()`.
|
|
469
390
|
|
|
470
391
|
|
|
471
392
|
|
|
@@ -504,19 +425,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
504
425
|
|
|
505
426
|
|
|
506
427
|
|
|
507
|
-
* @example
|
|
508
|
-
* // Get values (same as keys for Set)
|
|
509
|
-
* const ts = new TreeSet<number>([2, 1, 3]);
|
|
510
|
-
* console.log([...ts.values()]); // [1, 2, 3];
|
|
511
|
-
*/
|
|
512
|
-
values(): IterableIterator<K> {
|
|
513
|
-
return this.keys();
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
/**
|
|
517
|
-
* Iterate over `[value, value]` pairs (native Set convention).
|
|
518
|
-
*
|
|
519
|
-
* Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
|
|
520
428
|
|
|
521
429
|
|
|
522
430
|
|
|
@@ -545,6 +453,35 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
545
453
|
|
|
546
454
|
|
|
547
455
|
|
|
456
|
+
* @example
|
|
457
|
+
* // Unique tags with sorted order
|
|
458
|
+
* const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
|
|
459
|
+
*
|
|
460
|
+
* // Duplicates removed, sorted alphabetically
|
|
461
|
+
* console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
|
|
462
|
+
* console.log(tags.size); // 4;
|
|
463
|
+
*
|
|
464
|
+
* tags.add('angular');
|
|
465
|
+
* console.log(tags.first()); // 'angular';
|
|
466
|
+
* console.log(tags.last()); // 'typescript';
|
|
467
|
+
*/
|
|
468
|
+
add(key: K): this {
|
|
469
|
+
this._validateKey(key);
|
|
470
|
+
// RBT.set returns boolean; Set.add returns this.
|
|
471
|
+
this.#core.set(key, undefined);
|
|
472
|
+
return this;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Test whether a key exists.
|
|
477
|
+
* @remarks Expected time O(log n)
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
|
|
548
485
|
|
|
549
486
|
|
|
550
487
|
|
|
@@ -555,23 +492,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
555
492
|
|
|
556
493
|
|
|
557
494
|
|
|
558
|
-
* @example
|
|
559
|
-
* // Iterate entries
|
|
560
|
-
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
561
|
-
* console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
|
|
562
|
-
*/
|
|
563
|
-
*entries(): IterableIterator<[K, K]> {
|
|
564
|
-
for (const k of this.keys()) yield [k, k];
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
[Symbol.iterator](): IterableIterator<K> {
|
|
568
|
-
return this.keys();
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
/**
|
|
572
|
-
* Visit each value in ascending order.
|
|
573
|
-
*
|
|
574
|
-
* Callback follows native Set convention: `(value, value2, set)`.
|
|
575
495
|
|
|
576
496
|
|
|
577
497
|
|
|
@@ -610,22 +530,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
610
530
|
|
|
611
531
|
|
|
612
532
|
|
|
613
|
-
* @example
|
|
614
|
-
* // Execute for each
|
|
615
|
-
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
616
|
-
* const keys: number[] = [];
|
|
617
|
-
* ts.forEach(k => keys.push(k));
|
|
618
|
-
* console.log(keys); // [1, 2, 3];
|
|
619
|
-
*/
|
|
620
|
-
forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: any): void {
|
|
621
|
-
for (const k of this) cb.call(thisArg, k, k, this);
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
/**
|
|
625
|
-
* Create a new TreeSet by mapping each value to a new key.
|
|
626
|
-
*
|
|
627
|
-
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
628
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
629
533
|
|
|
630
534
|
|
|
631
535
|
|
|
@@ -664,31 +568,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
664
568
|
|
|
665
569
|
|
|
666
570
|
|
|
667
|
-
* @example
|
|
668
|
-
* // Transform
|
|
669
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
670
|
-
* const doubled = ts.map(k => k * 2);
|
|
671
|
-
* console.log([...doubled]); // [2, 4, 6];
|
|
672
|
-
*/
|
|
673
|
-
map<MK>(
|
|
674
|
-
callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
|
|
675
|
-
options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
676
|
-
thisArg?: unknown
|
|
677
|
-
): TreeSet<MK> {
|
|
678
|
-
const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
|
|
679
|
-
let index = 0;
|
|
680
|
-
for (const v of this) {
|
|
681
|
-
const mk = thisArg === undefined
|
|
682
|
-
? callbackfn(v, index++, this)
|
|
683
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
|
|
684
|
-
out.add(mk);
|
|
685
|
-
}
|
|
686
|
-
return out;
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
/**
|
|
690
|
-
* Create a new TreeSet containing only values that satisfy the predicate.
|
|
691
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
692
571
|
|
|
693
572
|
|
|
694
573
|
|
|
@@ -727,27 +606,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
727
606
|
|
|
728
607
|
|
|
729
608
|
|
|
730
|
-
* @example
|
|
731
|
-
* // Filter
|
|
732
|
-
* const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
|
|
733
|
-
* const evens = ts.filter(k => k % 2 === 0);
|
|
734
|
-
* console.log([...evens]); // [2, 4];
|
|
735
|
-
*/
|
|
736
|
-
filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
|
|
737
|
-
const out = new TreeSet<K>([], { comparator: this.#userComparator });
|
|
738
|
-
let index = 0;
|
|
739
|
-
for (const v of this) {
|
|
740
|
-
const ok = thisArg === undefined
|
|
741
|
-
? callbackfn(v, index++, this)
|
|
742
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
743
|
-
if (ok) out.add(v);
|
|
744
|
-
}
|
|
745
|
-
return out;
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
/**
|
|
749
|
-
* Reduce values into a single accumulator.
|
|
750
|
-
* @remarks Time O(n), Space O(1)
|
|
751
609
|
|
|
752
610
|
|
|
753
611
|
|
|
@@ -787,21 +645,44 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
787
645
|
|
|
788
646
|
|
|
789
647
|
* @example
|
|
790
|
-
* //
|
|
791
|
-
* const
|
|
792
|
-
*
|
|
793
|
-
*
|
|
648
|
+
* // Checking membership in a sorted collection
|
|
649
|
+
* const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
|
|
650
|
+
*
|
|
651
|
+
* console.log(allowed.has('admin')); // true;
|
|
652
|
+
* console.log(allowed.has('guest')); // false;
|
|
794
653
|
*/
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
for (const v of this) acc = callbackfn(acc, v, index++, this);
|
|
799
|
-
return acc;
|
|
654
|
+
has(key: K): boolean {
|
|
655
|
+
this._validateKey(key);
|
|
656
|
+
return this.#core.has(key);
|
|
800
657
|
}
|
|
801
658
|
|
|
802
659
|
/**
|
|
803
|
-
*
|
|
804
|
-
* @
|
|
660
|
+
* Delete a key.
|
|
661
|
+
* @returns `true` if the key existed; otherwise `false`.
|
|
662
|
+
* @remarks Expected time O(log n)
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
|
|
805
686
|
|
|
806
687
|
|
|
807
688
|
|
|
@@ -838,25 +719,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
838
719
|
|
|
839
720
|
|
|
840
721
|
|
|
841
|
-
* @example
|
|
842
|
-
* // Test all
|
|
843
|
-
* const ts = new TreeSet<number>([2, 4, 6]);
|
|
844
|
-
* console.log(ts.every(k => k > 0)); // true;
|
|
845
|
-
*/
|
|
846
|
-
every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
847
|
-
let index = 0;
|
|
848
|
-
for (const v of this) {
|
|
849
|
-
const ok = thisArg === undefined
|
|
850
|
-
? callbackfn(v, index++, this)
|
|
851
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
852
|
-
if (!ok) return false;
|
|
853
|
-
}
|
|
854
|
-
return true;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
/**
|
|
858
|
-
* Test whether any value satisfies a predicate.
|
|
859
|
-
* @remarks Time O(n), Space O(1)
|
|
860
722
|
|
|
861
723
|
|
|
862
724
|
|
|
@@ -893,25 +755,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
893
755
|
|
|
894
756
|
|
|
895
757
|
|
|
896
|
-
* @example
|
|
897
|
-
* // Test any
|
|
898
|
-
* const ts = new TreeSet<number>([1, 3, 5]);
|
|
899
|
-
* console.log(ts.some(k => k === 3)); // true;
|
|
900
|
-
*/
|
|
901
|
-
some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
902
|
-
let index = 0;
|
|
903
|
-
for (const v of this) {
|
|
904
|
-
const ok = thisArg === undefined
|
|
905
|
-
? callbackfn(v, index++, this)
|
|
906
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
907
|
-
if (ok) return true;
|
|
908
|
-
}
|
|
909
|
-
return false;
|
|
910
|
-
}
|
|
911
|
-
|
|
912
|
-
/**
|
|
913
|
-
* Find the first value that satisfies a predicate.
|
|
914
|
-
* @remarks Time O(n), Space O(1)
|
|
915
758
|
|
|
916
759
|
|
|
917
760
|
|
|
@@ -948,26 +791,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
948
791
|
|
|
949
792
|
|
|
950
793
|
|
|
951
|
-
* @example
|
|
952
|
-
* // Find entry
|
|
953
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
954
|
-
* const found = ts.find(k => k === 2);
|
|
955
|
-
* console.log(found); // 2;
|
|
956
|
-
*/
|
|
957
|
-
find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
|
|
958
|
-
let index = 0;
|
|
959
|
-
for (const v of this) {
|
|
960
|
-
const ok = thisArg === undefined
|
|
961
|
-
? callbackfn(v, index++, this)
|
|
962
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
963
|
-
if (ok) return v;
|
|
964
|
-
}
|
|
965
|
-
return undefined;
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
/**
|
|
969
|
-
* Materialize the set into an array of keys.
|
|
970
|
-
* @remarks Time O(n), Space O(n)
|
|
971
794
|
|
|
972
795
|
|
|
973
796
|
|
|
@@ -1007,17 +830,21 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1007
830
|
|
|
1008
831
|
|
|
1009
832
|
* @example
|
|
1010
|
-
* //
|
|
1011
|
-
* const
|
|
1012
|
-
*
|
|
833
|
+
* // Removing elements while maintaining order
|
|
834
|
+
* const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
|
|
835
|
+
*
|
|
836
|
+
* console.log(nums.delete(5)); // true;
|
|
837
|
+
* console.log(nums.delete(5)); // false; // already gone
|
|
838
|
+
* console.log([...nums]); // [1, 3, 7, 9];
|
|
1013
839
|
*/
|
|
1014
|
-
|
|
1015
|
-
|
|
840
|
+
delete(key: K): boolean {
|
|
841
|
+
this._validateKey(key);
|
|
842
|
+
const res = this.#core.delete(key);
|
|
843
|
+
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
1016
844
|
}
|
|
1017
845
|
|
|
1018
846
|
/**
|
|
1019
|
-
*
|
|
1020
|
-
* @remarks Time O(n), Space O(n)
|
|
847
|
+
* Remove all keys.
|
|
1021
848
|
|
|
1022
849
|
|
|
1023
850
|
|
|
@@ -1056,20 +883,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1056
883
|
|
|
1057
884
|
|
|
1058
885
|
|
|
1059
|
-
* @example
|
|
1060
|
-
* // Display tree
|
|
1061
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
1062
|
-
* expect(() => ts.print()).not.toThrow();
|
|
1063
|
-
*/
|
|
1064
|
-
print(): void {
|
|
1065
|
-
// Delegate to the underlying tree's visualization.
|
|
1066
|
-
this.#core.print();
|
|
1067
|
-
}
|
|
1068
|
-
|
|
1069
|
-
// Navigable operations
|
|
1070
|
-
|
|
1071
|
-
/**
|
|
1072
|
-
* Smallest key in the set.
|
|
1073
886
|
|
|
1074
887
|
|
|
1075
888
|
|
|
@@ -1081,40 +894,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1081
894
|
|
|
1082
895
|
|
|
1083
896
|
|
|
1084
|
-
* @example
|
|
1085
|
-
* // Student grade ranking with custom comparator
|
|
1086
|
-
* interface Student {
|
|
1087
|
-
* name: string;
|
|
1088
|
-
* gpa: number;
|
|
1089
|
-
* }
|
|
1090
|
-
*
|
|
1091
|
-
* const ranking = new TreeSet<Student>(
|
|
1092
|
-
* [
|
|
1093
|
-
* { name: 'Alice', gpa: 3.8 },
|
|
1094
|
-
* { name: 'Bob', gpa: 3.5 },
|
|
1095
|
-
* { name: 'Charlie', gpa: 3.9 },
|
|
1096
|
-
* { name: 'Diana', gpa: 3.5 }
|
|
1097
|
-
* ],
|
|
1098
|
-
* { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
|
|
1099
|
-
* );
|
|
1100
|
-
*
|
|
1101
|
-
* // Sorted by GPA descending, then name ascending
|
|
1102
|
-
* const names = [...ranking].map(s => s.name);
|
|
1103
|
-
* console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
|
|
1104
|
-
*
|
|
1105
|
-
* // Top student
|
|
1106
|
-
* console.log(ranking.first()?.name); // 'Charlie';
|
|
1107
|
-
*
|
|
1108
|
-
* // Filter students with GPA >= 3.8
|
|
1109
|
-
* const honors = ranking.filter(s => s.gpa >= 3.8);
|
|
1110
|
-
* console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
|
|
1111
|
-
*/
|
|
1112
|
-
first(): K | undefined {
|
|
1113
|
-
return this.#core.getLeftMost();
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
/**
|
|
1117
|
-
* Largest key in the set.
|
|
1118
897
|
|
|
1119
898
|
|
|
1120
899
|
|
|
@@ -1126,18 +905,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1126
905
|
|
|
1127
906
|
|
|
1128
907
|
|
|
1129
|
-
* @example
|
|
1130
|
-
* // Get the maximum element
|
|
1131
|
-
* const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
|
|
1132
|
-
* console.log(temps.last()); // 30;
|
|
1133
|
-
* console.log(temps.first()); // 15;
|
|
1134
|
-
*/
|
|
1135
|
-
last(): K | undefined {
|
|
1136
|
-
return this.#core.getRightMost();
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
/**
|
|
1140
|
-
* Remove and return the smallest key.
|
|
1141
908
|
|
|
1142
909
|
|
|
1143
910
|
|
|
@@ -1149,23 +916,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1149
916
|
|
|
1150
917
|
|
|
1151
918
|
|
|
1152
|
-
* @example
|
|
1153
|
-
* // Remove and return minimum
|
|
1154
|
-
* const queue = new TreeSet<number>([5, 1, 8, 3]);
|
|
1155
|
-
*
|
|
1156
|
-
* console.log(queue.pollFirst()); // 1;
|
|
1157
|
-
* console.log(queue.pollFirst()); // 3;
|
|
1158
|
-
* console.log(queue.size); // 2;
|
|
1159
|
-
*/
|
|
1160
|
-
pollFirst(): K | undefined {
|
|
1161
|
-
const k = this.first();
|
|
1162
|
-
if (k === undefined) return undefined;
|
|
1163
|
-
this.delete(k);
|
|
1164
|
-
return k;
|
|
1165
|
-
}
|
|
1166
|
-
|
|
1167
|
-
/**
|
|
1168
|
-
* Remove and return the largest key.
|
|
1169
919
|
|
|
1170
920
|
|
|
1171
921
|
|
|
@@ -1177,22 +927,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1177
927
|
|
|
1178
928
|
|
|
1179
929
|
|
|
1180
|
-
* @example
|
|
1181
|
-
* // Remove and return maximum
|
|
1182
|
-
* const stack = new TreeSet<number>([10, 20, 30]);
|
|
1183
|
-
*
|
|
1184
|
-
* console.log(stack.pollLast()); // 30;
|
|
1185
|
-
* console.log(stack.size); // 2;
|
|
1186
|
-
*/
|
|
1187
|
-
pollLast(): K | undefined {
|
|
1188
|
-
const k = this.last();
|
|
1189
|
-
if (k === undefined) return undefined;
|
|
1190
|
-
this.delete(k);
|
|
1191
|
-
return k;
|
|
1192
|
-
}
|
|
1193
|
-
|
|
1194
|
-
/**
|
|
1195
|
-
* Smallest key that is >= the given key.
|
|
1196
930
|
|
|
1197
931
|
|
|
1198
932
|
|
|
@@ -1231,30 +965,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1231
965
|
|
|
1232
966
|
|
|
1233
967
|
|
|
1234
|
-
* @example
|
|
1235
|
-
* // Finding nearest available time slot
|
|
1236
|
-
* // Available appointment times (minutes from midnight)
|
|
1237
|
-
* const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
|
|
1238
|
-
*
|
|
1239
|
-
* // Customer wants something around 10:30 (630 min)
|
|
1240
|
-
* const nearest = slots.ceiling(630);
|
|
1241
|
-
* console.log(nearest); // 660; // 11:00 AM
|
|
1242
|
-
*
|
|
1243
|
-
* // What's the latest slot before 2:00 PM (840)?
|
|
1244
|
-
* const before2pm = slots.lower(840);
|
|
1245
|
-
* console.log(before2pm); // 720; // 12:00 PM
|
|
1246
|
-
*
|
|
1247
|
-
* // Book the 11:00 slot
|
|
1248
|
-
* slots.delete(660);
|
|
1249
|
-
* console.log(slots.ceiling(630)); // 720;
|
|
1250
|
-
*/
|
|
1251
|
-
ceiling(key: K): K | undefined {
|
|
1252
|
-
this._validateKey(key);
|
|
1253
|
-
return this.#core.ceiling(key);
|
|
1254
|
-
}
|
|
1255
|
-
|
|
1256
|
-
/**
|
|
1257
|
-
* Largest key that is <= the given key.
|
|
1258
968
|
|
|
1259
969
|
|
|
1260
970
|
|
|
@@ -1294,21 +1004,17 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1294
1004
|
|
|
1295
1005
|
|
|
1296
1006
|
* @example
|
|
1297
|
-
* //
|
|
1298
|
-
* const
|
|
1299
|
-
*
|
|
1300
|
-
*
|
|
1301
|
-
* console.log(breakpoints.floor(800)); // 768;
|
|
1302
|
-
* console.log(breakpoints.floor(1024)); // 1024; // exact match
|
|
1303
|
-
* console.log(breakpoints.floor(100)); // undefined;
|
|
1007
|
+
* // Remove all
|
|
1008
|
+
* const ts = new TreeSet<number>([1, 2]);
|
|
1009
|
+
* ts.clear();
|
|
1010
|
+
* console.log(ts.isEmpty()); // true;
|
|
1304
1011
|
*/
|
|
1305
|
-
|
|
1306
|
-
this.
|
|
1307
|
-
return this.#core.floor(key);
|
|
1012
|
+
clear(): void {
|
|
1013
|
+
this.#core.clear();
|
|
1308
1014
|
}
|
|
1309
1015
|
|
|
1310
1016
|
/**
|
|
1311
|
-
*
|
|
1017
|
+
* Iterate over keys in ascending order.
|
|
1312
1018
|
|
|
1313
1019
|
|
|
1314
1020
|
|
|
@@ -1347,9 +1053,2727 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1347
1053
|
|
|
1348
1054
|
|
|
1349
1055
|
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1056
|
+
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
|
|
1063
|
+
|
|
1064
|
+
|
|
1065
|
+
|
|
1066
|
+
|
|
1067
|
+
|
|
1068
|
+
|
|
1069
|
+
|
|
1070
|
+
|
|
1071
|
+
|
|
1072
|
+
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
|
|
1076
|
+
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
|
|
1080
|
+
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
|
|
1116
|
+
|
|
1117
|
+
|
|
1118
|
+
|
|
1119
|
+
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
|
|
1149
|
+
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
|
|
1153
|
+
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
* @example
|
|
1177
|
+
* // Get sorted keys
|
|
1178
|
+
* const ts = new TreeSet<number>([30, 10, 20]);
|
|
1179
|
+
* console.log([...ts.keys()]); // [10, 20, 30];
|
|
1180
|
+
*/
|
|
1181
|
+
keys(): IterableIterator<K> {
|
|
1182
|
+
return this.#core.keys();
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
/**
|
|
1186
|
+
* Iterate over values in ascending order.
|
|
1187
|
+
*
|
|
1188
|
+
* Note: for Set-like containers, `values()` is the same as `keys()`.
|
|
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
|
+
* @example
|
|
1348
|
+
* // Get values (same as keys for Set)
|
|
1349
|
+
* const ts = new TreeSet<number>([2, 1, 3]);
|
|
1350
|
+
* console.log([...ts.values()]); // [1, 2, 3];
|
|
1351
|
+
*/
|
|
1352
|
+
values(): IterableIterator<K> {
|
|
1353
|
+
return this.keys();
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
/**
|
|
1357
|
+
* Iterate over `[value, value]` pairs (native Set convention).
|
|
1358
|
+
*
|
|
1359
|
+
* Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
|
|
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
|
+
|
|
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
|
+
* @example
|
|
1519
|
+
* // Iterate entries
|
|
1520
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1521
|
+
* console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
|
|
1522
|
+
*/
|
|
1523
|
+
*entries(): IterableIterator<[K, K]> {
|
|
1524
|
+
for (const k of this.keys()) yield [k, k];
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
[Symbol.iterator](): IterableIterator<K> {
|
|
1528
|
+
return this.keys();
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
/**
|
|
1532
|
+
* Visit each value in ascending order.
|
|
1533
|
+
*
|
|
1534
|
+
* Callback follows native Set convention: `(value, value2, set)`.
|
|
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
|
+
* @example
|
|
1694
|
+
* // Execute for each
|
|
1695
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1696
|
+
* const keys: number[] = [];
|
|
1697
|
+
* ts.forEach(k => keys.push(k));
|
|
1698
|
+
* console.log(keys); // [1, 2, 3];
|
|
1699
|
+
*/
|
|
1700
|
+
forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: unknown): void {
|
|
1701
|
+
for (const k of this) cb.call(thisArg, k, k, this);
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
/**
|
|
1705
|
+
* Create a new TreeSet by mapping each value to a new key.
|
|
1706
|
+
*
|
|
1707
|
+
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
1708
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
|
|
1733
|
+
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
|
|
1740
|
+
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
|
|
1744
|
+
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
|
|
1750
|
+
|
|
1751
|
+
|
|
1752
|
+
|
|
1753
|
+
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
|
|
1757
|
+
|
|
1758
|
+
|
|
1759
|
+
|
|
1760
|
+
|
|
1761
|
+
|
|
1762
|
+
|
|
1763
|
+
|
|
1764
|
+
|
|
1765
|
+
|
|
1766
|
+
|
|
1767
|
+
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
|
|
1775
|
+
|
|
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
|
+
* @example
|
|
1868
|
+
* // Transform
|
|
1869
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
1870
|
+
* const doubled = ts.map(k => k * 2);
|
|
1871
|
+
* console.log([...doubled]); // [2, 4, 6];
|
|
1872
|
+
*/
|
|
1873
|
+
map<MK>(
|
|
1874
|
+
callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
|
|
1875
|
+
options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
1876
|
+
thisArg?: unknown
|
|
1877
|
+
): TreeSet<MK> {
|
|
1878
|
+
const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
|
|
1879
|
+
let index = 0;
|
|
1880
|
+
for (const v of this) {
|
|
1881
|
+
const mk = thisArg === undefined
|
|
1882
|
+
? callbackfn(v, index++, this)
|
|
1883
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
|
|
1884
|
+
out.add(mk);
|
|
1885
|
+
}
|
|
1886
|
+
return out;
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
/**
|
|
1890
|
+
* Create a new TreeSet containing only values that satisfy the predicate.
|
|
1891
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1892
|
+
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
|
|
1896
|
+
|
|
1897
|
+
|
|
1898
|
+
|
|
1899
|
+
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
|
|
1903
|
+
|
|
1904
|
+
|
|
1905
|
+
|
|
1906
|
+
|
|
1907
|
+
|
|
1908
|
+
|
|
1909
|
+
|
|
1910
|
+
|
|
1911
|
+
|
|
1912
|
+
|
|
1913
|
+
|
|
1914
|
+
|
|
1915
|
+
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
|
|
1919
|
+
|
|
1920
|
+
|
|
1921
|
+
|
|
1922
|
+
|
|
1923
|
+
|
|
1924
|
+
|
|
1925
|
+
|
|
1926
|
+
|
|
1927
|
+
|
|
1928
|
+
|
|
1929
|
+
|
|
1930
|
+
|
|
1931
|
+
|
|
1932
|
+
|
|
1933
|
+
|
|
1934
|
+
|
|
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
|
+
* @example
|
|
2051
|
+
* // Filter
|
|
2052
|
+
* const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
|
|
2053
|
+
* const evens = ts.filter(k => k % 2 === 0);
|
|
2054
|
+
* console.log([...evens]); // [2, 4];
|
|
2055
|
+
*/
|
|
2056
|
+
filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
|
|
2057
|
+
const out = new TreeSet<K>([], { comparator: this.#userComparator });
|
|
2058
|
+
let index = 0;
|
|
2059
|
+
for (const v of this) {
|
|
2060
|
+
const ok = thisArg === undefined
|
|
2061
|
+
? callbackfn(v, index++, this)
|
|
2062
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2063
|
+
if (ok) out.add(v);
|
|
2064
|
+
}
|
|
2065
|
+
return out;
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
/**
|
|
2069
|
+
* Reduce values into a single accumulator.
|
|
2070
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
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
|
+
* @example
|
|
2230
|
+
* // Aggregate
|
|
2231
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2232
|
+
* const sum = ts.reduce((acc, k) => acc + k, 0);
|
|
2233
|
+
* console.log(sum); // 6;
|
|
2234
|
+
*/
|
|
2235
|
+
reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
|
|
2236
|
+
let acc = initialValue;
|
|
2237
|
+
let index = 0;
|
|
2238
|
+
for (const v of this) acc = callbackfn(acc, v, index++, this);
|
|
2239
|
+
return acc;
|
|
2240
|
+
}
|
|
2241
|
+
|
|
2242
|
+
/**
|
|
2243
|
+
* Test whether all values satisfy a predicate.
|
|
2244
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
2324
|
+
|
|
2325
|
+
|
|
2326
|
+
|
|
2327
|
+
|
|
2328
|
+
|
|
2329
|
+
|
|
2330
|
+
|
|
2331
|
+
|
|
2332
|
+
|
|
2333
|
+
|
|
2334
|
+
|
|
2335
|
+
|
|
2336
|
+
|
|
2337
|
+
|
|
2338
|
+
|
|
2339
|
+
|
|
2340
|
+
|
|
2341
|
+
|
|
2342
|
+
|
|
2343
|
+
|
|
2344
|
+
|
|
2345
|
+
|
|
2346
|
+
|
|
2347
|
+
|
|
2348
|
+
|
|
2349
|
+
|
|
2350
|
+
|
|
2351
|
+
|
|
2352
|
+
|
|
2353
|
+
|
|
2354
|
+
|
|
2355
|
+
|
|
2356
|
+
|
|
2357
|
+
|
|
2358
|
+
|
|
2359
|
+
|
|
2360
|
+
|
|
2361
|
+
|
|
2362
|
+
|
|
2363
|
+
|
|
2364
|
+
|
|
2365
|
+
|
|
2366
|
+
|
|
2367
|
+
|
|
2368
|
+
|
|
2369
|
+
|
|
2370
|
+
|
|
2371
|
+
|
|
2372
|
+
|
|
2373
|
+
|
|
2374
|
+
|
|
2375
|
+
|
|
2376
|
+
|
|
2377
|
+
|
|
2378
|
+
|
|
2379
|
+
|
|
2380
|
+
|
|
2381
|
+
|
|
2382
|
+
|
|
2383
|
+
|
|
2384
|
+
|
|
2385
|
+
|
|
2386
|
+
|
|
2387
|
+
|
|
2388
|
+
|
|
2389
|
+
|
|
2390
|
+
|
|
2391
|
+
|
|
2392
|
+
|
|
2393
|
+
|
|
2394
|
+
|
|
2395
|
+
|
|
2396
|
+
|
|
2397
|
+
|
|
2398
|
+
|
|
2399
|
+
|
|
2400
|
+
|
|
2401
|
+
* @example
|
|
2402
|
+
* // Test all
|
|
2403
|
+
* const ts = new TreeSet<number>([2, 4, 6]);
|
|
2404
|
+
* console.log(ts.every(k => k > 0)); // true;
|
|
2405
|
+
*/
|
|
2406
|
+
every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
2407
|
+
let index = 0;
|
|
2408
|
+
for (const v of this) {
|
|
2409
|
+
const ok = thisArg === undefined
|
|
2410
|
+
? callbackfn(v, index++, this)
|
|
2411
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2412
|
+
if (!ok) return false;
|
|
2413
|
+
}
|
|
2414
|
+
return true;
|
|
2415
|
+
}
|
|
2416
|
+
|
|
2417
|
+
/**
|
|
2418
|
+
* Test whether any value satisfies a predicate.
|
|
2419
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
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
|
+
* @example
|
|
2577
|
+
* // Test any
|
|
2578
|
+
* const ts = new TreeSet<number>([1, 3, 5]);
|
|
2579
|
+
* console.log(ts.some(k => k === 3)); // true;
|
|
2580
|
+
*/
|
|
2581
|
+
some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
2582
|
+
let index = 0;
|
|
2583
|
+
for (const v of this) {
|
|
2584
|
+
const ok = thisArg === undefined
|
|
2585
|
+
? callbackfn(v, index++, this)
|
|
2586
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2587
|
+
if (ok) return true;
|
|
2588
|
+
}
|
|
2589
|
+
return false;
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2592
|
+
/**
|
|
2593
|
+
* Find the first value that satisfies a predicate.
|
|
2594
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
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
|
+
* @example
|
|
2752
|
+
* // Find entry
|
|
2753
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2754
|
+
* const found = ts.find(k => k === 2);
|
|
2755
|
+
* console.log(found); // 2;
|
|
2756
|
+
*/
|
|
2757
|
+
find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
|
|
2758
|
+
let index = 0;
|
|
2759
|
+
for (const v of this) {
|
|
2760
|
+
const ok = thisArg === undefined
|
|
2761
|
+
? callbackfn(v, index++, this)
|
|
2762
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2763
|
+
if (ok) return v;
|
|
2764
|
+
}
|
|
2765
|
+
return undefined;
|
|
2766
|
+
}
|
|
2767
|
+
|
|
2768
|
+
/**
|
|
2769
|
+
* Materialize the set into an array of keys.
|
|
2770
|
+
* @remarks Time O(n), Space O(n)
|
|
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
|
+
|
|
2910
|
+
|
|
2911
|
+
|
|
2912
|
+
|
|
2913
|
+
|
|
2914
|
+
|
|
2915
|
+
|
|
2916
|
+
|
|
2917
|
+
|
|
2918
|
+
|
|
2919
|
+
|
|
2920
|
+
|
|
2921
|
+
|
|
2922
|
+
|
|
2923
|
+
|
|
2924
|
+
|
|
2925
|
+
|
|
2926
|
+
|
|
2927
|
+
|
|
2928
|
+
|
|
2929
|
+
* @example
|
|
2930
|
+
* // Convert to array
|
|
2931
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
2932
|
+
* console.log(ts.toArray()); // [1, 2, 3];
|
|
2933
|
+
*/
|
|
2934
|
+
toArray(): K[] {
|
|
2935
|
+
return [...this];
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2938
|
+
/**
|
|
2939
|
+
* Print a human-friendly representation.
|
|
2940
|
+
* @remarks Time O(n), Space O(n)
|
|
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
|
+
* @example
|
|
3100
|
+
* // Display tree
|
|
3101
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
3102
|
+
* expect(() => ts.print()).not.toThrow();
|
|
3103
|
+
*/
|
|
3104
|
+
print(): void {
|
|
3105
|
+
// Delegate to the underlying tree's visualization.
|
|
3106
|
+
this.#core.print();
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
// Navigable operations
|
|
3110
|
+
|
|
3111
|
+
/**
|
|
3112
|
+
* Smallest key in the set.
|
|
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
|
+
* @example
|
|
3149
|
+
* // Student grade ranking with custom comparator
|
|
3150
|
+
* interface Student {
|
|
3151
|
+
* name: string;
|
|
3152
|
+
* gpa: number;
|
|
3153
|
+
* }
|
|
3154
|
+
*
|
|
3155
|
+
* const ranking = new TreeSet<Student>(
|
|
3156
|
+
* [
|
|
3157
|
+
* { name: 'Alice', gpa: 3.8 },
|
|
3158
|
+
* { name: 'Bob', gpa: 3.5 },
|
|
3159
|
+
* { name: 'Charlie', gpa: 3.9 },
|
|
3160
|
+
* { name: 'Diana', gpa: 3.5 }
|
|
3161
|
+
* ],
|
|
3162
|
+
* { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
|
|
3163
|
+
* );
|
|
3164
|
+
*
|
|
3165
|
+
* // Sorted by GPA descending, then name ascending
|
|
3166
|
+
* const names = [...ranking].map(s => s.name);
|
|
3167
|
+
* console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
|
|
3168
|
+
*
|
|
3169
|
+
* // Top student
|
|
3170
|
+
* console.log(ranking.first()?.name); // 'Charlie';
|
|
3171
|
+
*
|
|
3172
|
+
* // Filter students with GPA >= 3.8
|
|
3173
|
+
* const honors = ranking.filter(s => s.gpa >= 3.8);
|
|
3174
|
+
* console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
|
|
3175
|
+
*/
|
|
3176
|
+
first(): K | undefined {
|
|
3177
|
+
return this.#core.getLeftMost();
|
|
3178
|
+
}
|
|
3179
|
+
|
|
3180
|
+
/**
|
|
3181
|
+
* Largest key in the set.
|
|
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
|
+
* @example
|
|
3218
|
+
* // Get the maximum element
|
|
3219
|
+
* const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
|
|
3220
|
+
* console.log(temps.last()); // 30;
|
|
3221
|
+
* console.log(temps.first()); // 15;
|
|
3222
|
+
*/
|
|
3223
|
+
last(): K | undefined {
|
|
3224
|
+
return this.#core.getRightMost();
|
|
3225
|
+
}
|
|
3226
|
+
|
|
3227
|
+
/**
|
|
3228
|
+
* Remove and return the smallest key.
|
|
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
|
+
* @example
|
|
3265
|
+
* // Remove and return minimum
|
|
3266
|
+
* const queue = new TreeSet<number>([5, 1, 8, 3]);
|
|
3267
|
+
*
|
|
3268
|
+
* console.log(queue.pollFirst()); // 1;
|
|
3269
|
+
* console.log(queue.pollFirst()); // 3;
|
|
3270
|
+
* console.log(queue.size); // 2;
|
|
3271
|
+
*/
|
|
3272
|
+
pollFirst(): K | undefined {
|
|
3273
|
+
const k = this.first();
|
|
3274
|
+
if (k === undefined) return undefined;
|
|
3275
|
+
this.delete(k);
|
|
3276
|
+
return k;
|
|
3277
|
+
}
|
|
3278
|
+
|
|
3279
|
+
/**
|
|
3280
|
+
* Remove and return the largest key.
|
|
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
|
+
* @example
|
|
3317
|
+
* // Remove and return maximum
|
|
3318
|
+
* const stack = new TreeSet<number>([10, 20, 30]);
|
|
3319
|
+
*
|
|
3320
|
+
* console.log(stack.pollLast()); // 30;
|
|
3321
|
+
* console.log(stack.size); // 2;
|
|
3322
|
+
*/
|
|
3323
|
+
pollLast(): K | undefined {
|
|
3324
|
+
const k = this.last();
|
|
3325
|
+
if (k === undefined) return undefined;
|
|
3326
|
+
this.delete(k);
|
|
3327
|
+
return k;
|
|
3328
|
+
}
|
|
3329
|
+
|
|
3330
|
+
/**
|
|
3331
|
+
* Smallest key that is >= the given key.
|
|
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
|
+
* @example
|
|
3467
|
+
* // Finding nearest available time slot
|
|
3468
|
+
* // Available appointment times (minutes from midnight)
|
|
3469
|
+
* const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
|
|
3470
|
+
*
|
|
3471
|
+
* // Customer wants something around 10:30 (630 min)
|
|
3472
|
+
* const nearest = slots.ceiling(630);
|
|
3473
|
+
* console.log(nearest); // 660; // 11:00 AM
|
|
3474
|
+
*
|
|
3475
|
+
* // What's the latest slot before 2:00 PM (840)?
|
|
3476
|
+
* const before2pm = slots.lower(840);
|
|
3477
|
+
* console.log(before2pm); // 720; // 12:00 PM
|
|
3478
|
+
*
|
|
3479
|
+
* // Book the 11:00 slot
|
|
3480
|
+
* slots.delete(660);
|
|
3481
|
+
* console.log(slots.ceiling(630)); // 720;
|
|
3482
|
+
*/
|
|
3483
|
+
ceiling(key: K): K | undefined {
|
|
3484
|
+
this._validateKey(key);
|
|
3485
|
+
return this.#core.ceiling(key);
|
|
3486
|
+
}
|
|
3487
|
+
|
|
3488
|
+
/**
|
|
3489
|
+
* Largest key that is <= the given key.
|
|
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
|
+
|
|
3608
|
+
|
|
3609
|
+
|
|
3610
|
+
|
|
3611
|
+
|
|
3612
|
+
|
|
3613
|
+
|
|
3614
|
+
|
|
3615
|
+
|
|
3616
|
+
|
|
3617
|
+
|
|
3618
|
+
|
|
3619
|
+
|
|
3620
|
+
|
|
3621
|
+
|
|
3622
|
+
|
|
3623
|
+
|
|
3624
|
+
* @example
|
|
3625
|
+
* // Largest element ≤ target
|
|
3626
|
+
* const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
|
|
3627
|
+
*
|
|
3628
|
+
* // Current width is 800 → which breakpoint applies?
|
|
3629
|
+
* console.log(breakpoints.floor(800)); // 768;
|
|
3630
|
+
* console.log(breakpoints.floor(1024)); // 1024; // exact match
|
|
3631
|
+
* console.log(breakpoints.floor(100)); // undefined;
|
|
3632
|
+
*/
|
|
3633
|
+
floor(key: K): K | undefined {
|
|
3634
|
+
this._validateKey(key);
|
|
3635
|
+
return this.#core.floor(key);
|
|
3636
|
+
}
|
|
3637
|
+
|
|
3638
|
+
/**
|
|
3639
|
+
* Smallest key that is > the given key.
|
|
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
|
+
* @example
|
|
3775
|
+
* // Smallest element strictly > target
|
|
3776
|
+
* const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
|
|
1353
3777
|
*
|
|
1354
3778
|
* console.log(levels.higher(10)); // 25;
|
|
1355
3779
|
* console.log(levels.higher(100)); // undefined;
|
|
@@ -1378,6 +3802,102 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1378
3802
|
|
|
1379
3803
|
|
|
1380
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
|
+
|
|
3892
|
+
|
|
3893
|
+
|
|
3894
|
+
|
|
3895
|
+
|
|
3896
|
+
|
|
3897
|
+
|
|
3898
|
+
|
|
3899
|
+
|
|
3900
|
+
|
|
1381
3901
|
|
|
1382
3902
|
|
|
1383
3903
|
|
|
@@ -1433,6 +3953,102 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1433
3953
|
|
|
1434
3954
|
|
|
1435
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
|
+
|
|
1436
4052
|
|
|
1437
4053
|
|
|
1438
4054
|
|
|
@@ -1493,6 +4109,66 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1493
4109
|
return out;
|
|
1494
4110
|
}
|
|
1495
4111
|
|
|
4112
|
+
// ─── Order-Statistic Methods ───────────────────────────
|
|
4113
|
+
|
|
4114
|
+
/**
|
|
4115
|
+
* Returns the element at the k-th position in tree order (0-indexed).
|
|
4116
|
+
* @remarks Time O(log n). Requires `enableOrderStatistic: true`.
|
|
4117
|
+
|
|
4118
|
+
|
|
4119
|
+
|
|
4120
|
+
* @example
|
|
4121
|
+
* // Find k-th element in a TreeSet
|
|
4122
|
+
* const set = new TreeSet<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
|
|
4123
|
+
* console.log(set.getByRank(0)); // 10;
|
|
4124
|
+
* console.log(set.getByRank(2)); // 30;
|
|
4125
|
+
* console.log(set.getRank(30)); // 2;
|
|
4126
|
+
*/
|
|
4127
|
+
getByRank(k: number): K | undefined {
|
|
4128
|
+
return this.#core.getByRank(k);
|
|
4129
|
+
}
|
|
4130
|
+
|
|
4131
|
+
/**
|
|
4132
|
+
* Returns the 0-based rank of a key (number of elements that precede it in tree order).
|
|
4133
|
+
* @remarks Time O(log n). Requires `enableOrderStatistic: true`.
|
|
4134
|
+
* @example
|
|
4135
|
+
* // Get the rank of a key in sorted order
|
|
4136
|
+
* const tree = new TreeSet<number>(
|
|
4137
|
+
* [10, 20, 30, 40, 50],
|
|
4138
|
+
* { enableOrderStatistic: true }
|
|
4139
|
+
* );
|
|
4140
|
+
* console.log(tree.getRank(10)); // 0; // smallest → rank 0
|
|
4141
|
+
* console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
|
|
4142
|
+
* console.log(tree.getRank(50)); // 4; // largest → rank 4
|
|
4143
|
+
* console.log(tree.getRank(25)); // 2;
|
|
4144
|
+
*/
|
|
4145
|
+
getRank(key: K): number {
|
|
4146
|
+
return this.#core.getRank(key);
|
|
4147
|
+
}
|
|
4148
|
+
|
|
4149
|
+
/**
|
|
4150
|
+
* Returns elements by rank range (0-indexed, inclusive on both ends).
|
|
4151
|
+
* @remarks Time O(log n + k). Requires `enableOrderStatistic: true`.
|
|
4152
|
+
|
|
4153
|
+
* @example
|
|
4154
|
+
* // Pagination with rangeByRank
|
|
4155
|
+
* const tree = new TreeSet<number>(
|
|
4156
|
+
* [10, 20, 30, 40, 50, 60, 70, 80, 90],
|
|
4157
|
+
* { enableOrderStatistic: true }
|
|
4158
|
+
* );
|
|
4159
|
+
* const pageSize = 3;
|
|
4160
|
+
*
|
|
4161
|
+
* // Page 1
|
|
4162
|
+
* console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
|
|
4163
|
+
* // Page 2
|
|
4164
|
+
* console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
|
|
4165
|
+
* // Page 3
|
|
4166
|
+
* console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
|
|
4167
|
+
*/
|
|
4168
|
+
rangeByRank(start: number, end: number): K[] {
|
|
4169
|
+
return this.#core.rangeByRank(start, end).filter((k): k is K => k !== undefined);
|
|
4170
|
+
}
|
|
4171
|
+
|
|
1496
4172
|
/**
|
|
1497
4173
|
* Creates a shallow clone of this set.
|
|
1498
4174
|
* @remarks Time O(n log n), Space O(n)
|
|
@@ -1514,6 +4190,126 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1514
4190
|
|
|
1515
4191
|
|
|
1516
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
|
+
|
|
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
|
+
|
|
1517
4313
|
|
|
1518
4314
|
|
|
1519
4315
|
|