max-priority-queue-typed 2.5.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +294 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +294 -0
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +294 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +294 -0
- package/dist/esm-legacy/index.mjs.map +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 +252 -0
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +294 -0
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +527 -2
- package/dist/types/data-structures/binary-tree/bst.d.ts +505 -1
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +399 -0
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +126 -1
- package/dist/types/data-structures/binary-tree/tree-map.d.ts +2881 -382
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2867 -347
- package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2328 -312
- package/dist/types/data-structures/binary-tree/tree-set.d.ts +2671 -277
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/types/data-structures/graph/directed-graph.d.ts +210 -0
- package/dist/types/data-structures/graph/undirected-graph.d.ts +189 -0
- package/dist/types/data-structures/hash/hash-map.d.ts +241 -10
- package/dist/types/data-structures/heap/heap.d.ts +294 -0
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +360 -3
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +318 -3
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +380 -2
- package/dist/types/data-structures/matrix/matrix.d.ts +168 -0
- package/dist/types/data-structures/queue/deque.d.ts +319 -4
- package/dist/types/data-structures/queue/queue.d.ts +252 -0
- package/dist/types/data-structures/stack/stack.d.ts +210 -0
- package/dist/types/data-structures/trie/trie.d.ts +256 -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/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/max-priority-queue-typed.js +294 -0
- package/dist/umd/max-priority-queue-typed.js.map +1 -1
- package/dist/umd/max-priority-queue-typed.min.js.map +1 -1
- package/package.json +2 -2
- package/src/data-structures/base/index.ts +1 -0
- 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 +252 -0
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +295 -1
- package/src/data-structures/binary-tree/binary-tree.ts +527 -2
- package/src/data-structures/binary-tree/bst.ts +505 -1
- package/src/data-structures/binary-tree/red-black-tree.ts +399 -0
- package/src/data-structures/binary-tree/segment-tree.ts +127 -2
- package/src/data-structures/binary-tree/tree-map.ts +2958 -459
- package/src/data-structures/binary-tree/tree-multi-map.ts +3069 -549
- package/src/data-structures/binary-tree/tree-multi-set.ts +2476 -460
- package/src/data-structures/binary-tree/tree-set.ts +2816 -422
- package/src/data-structures/graph/abstract-graph.ts +4 -4
- package/src/data-structures/graph/directed-graph.ts +210 -0
- package/src/data-structures/graph/undirected-graph.ts +189 -0
- package/src/data-structures/hash/hash-map.ts +246 -15
- package/src/data-structures/heap/heap.ts +294 -0
- package/src/data-structures/linked-list/doubly-linked-list.ts +360 -3
- package/src/data-structures/linked-list/singly-linked-list.ts +318 -3
- package/src/data-structures/linked-list/skip-linked-list.ts +380 -2
- package/src/data-structures/matrix/matrix.ts +169 -1
- package/src/data-structures/queue/deque.ts +320 -5
- package/src/data-structures/queue/queue.ts +252 -0
- package/src/data-structures/stack/stack.ts +210 -0
- package/src/data-structures/trie/trie.ts +257 -5
- package/src/interfaces/graph.ts +1 -1
- package/src/types/common.ts +2 -2
- 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
|
@@ -175,17 +175,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
175
175
|
|
|
176
176
|
|
|
177
177
|
|
|
178
|
-
* @example
|
|
179
|
-
* // Check empty
|
|
180
|
-
* console.log(new TreeMap().isEmpty()); // true;
|
|
181
|
-
*/
|
|
182
|
-
isEmpty(): boolean {
|
|
183
|
-
return this.size === 0;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/**
|
|
187
|
-
* Set or overwrite a value for a key.
|
|
188
|
-
* @remarks Expected time O(log n)
|
|
189
178
|
|
|
190
179
|
|
|
191
180
|
|
|
@@ -233,36 +222,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
233
222
|
|
|
234
223
|
|
|
235
224
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
* console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
|
|
246
|
-
* console.log(contacts.get('Bob')); // '555-0102';
|
|
247
|
-
*
|
|
248
|
-
* // Find the first contact alphabetically after 'B'
|
|
249
|
-
* console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
|
|
250
|
-
*
|
|
251
|
-
* // Find contacts in range
|
|
252
|
-
* console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
|
|
253
|
-
* // ['Alice', '555-0101'],
|
|
254
|
-
* // ['Bob', '555-0102']
|
|
255
|
-
* // ];
|
|
256
|
-
*/
|
|
257
|
-
set(key: K, value: V | undefined): this {
|
|
258
|
-
this._validateKey(key);
|
|
259
|
-
this.#core.set(key, value as V);
|
|
260
|
-
return this;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
/**
|
|
264
|
-
* Get the value under a key.
|
|
265
|
-
* @remarks Expected time O(log n)
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
|
|
266
234
|
|
|
267
235
|
|
|
268
236
|
|
|
@@ -313,24 +281,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
313
281
|
|
|
314
282
|
|
|
315
283
|
* @example
|
|
316
|
-
* //
|
|
317
|
-
*
|
|
318
|
-
* ['maxRetries', 3],
|
|
319
|
-
* ['timeout', 5000],
|
|
320
|
-
* ['poolSize', 10]
|
|
321
|
-
* ]);
|
|
322
|
-
*
|
|
323
|
-
* console.log(config.get('timeout')); // 5000;
|
|
324
|
-
* console.log(config.get('missing')); // undefined;
|
|
325
|
-
* console.log(config.size); // 3;
|
|
284
|
+
* // Check empty
|
|
285
|
+
* console.log(new TreeMap().isEmpty()); // true;
|
|
326
286
|
*/
|
|
327
|
-
|
|
328
|
-
this.
|
|
329
|
-
return this.#core.get(key);
|
|
287
|
+
isEmpty(): boolean {
|
|
288
|
+
return this.size === 0;
|
|
330
289
|
}
|
|
331
290
|
|
|
332
291
|
/**
|
|
333
|
-
*
|
|
292
|
+
* Set or overwrite a value for a key.
|
|
334
293
|
* @remarks Expected time O(log n)
|
|
335
294
|
|
|
336
295
|
|
|
@@ -381,26 +340,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
381
340
|
|
|
382
341
|
|
|
383
342
|
|
|
384
|
-
* @example
|
|
385
|
-
* // Feature flag checking
|
|
386
|
-
* const flags = new TreeMap<string, boolean>([
|
|
387
|
-
* ['darkMode', true],
|
|
388
|
-
* ['betaFeature', false],
|
|
389
|
-
* ['notifications', true]
|
|
390
|
-
* ]);
|
|
391
|
-
*
|
|
392
|
-
* console.log(flags.has('darkMode')); // true;
|
|
393
|
-
* console.log(flags.has('unknownFlag')); // false;
|
|
394
|
-
*/
|
|
395
|
-
has(key: K): boolean {
|
|
396
|
-
this._validateKey(key);
|
|
397
|
-
return this.#core.has(key);
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
/**
|
|
401
|
-
* Delete a key.
|
|
402
|
-
* @returns `true` if the key existed; otherwise `false`.
|
|
403
|
-
* @remarks Expected time O(log n)
|
|
404
343
|
|
|
405
344
|
|
|
406
345
|
|
|
@@ -450,27 +389,22 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
450
389
|
|
|
451
390
|
|
|
452
391
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
/**
|
|
473
|
-
* Remove all entries.
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
|
|
474
408
|
|
|
475
409
|
|
|
476
410
|
|
|
@@ -510,17 +444,37 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
510
444
|
|
|
511
445
|
|
|
512
446
|
* @example
|
|
513
|
-
* //
|
|
514
|
-
* const
|
|
515
|
-
*
|
|
516
|
-
*
|
|
447
|
+
* // Sorted dictionary for a contact book
|
|
448
|
+
* const contacts = new TreeMap<string, string>([
|
|
449
|
+
* ['Bob', '555-0102'],
|
|
450
|
+
* ['Alice', '555-0101'],
|
|
451
|
+
* ['Charlie', '555-0103']
|
|
452
|
+
* ]);
|
|
453
|
+
*
|
|
454
|
+
* // Contacts are automatically sorted by name
|
|
455
|
+
* console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
|
|
456
|
+
* console.log(contacts.get('Bob')); // '555-0102';
|
|
457
|
+
*
|
|
458
|
+
* // Find the first contact alphabetically after 'B'
|
|
459
|
+
* console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
|
|
460
|
+
*
|
|
461
|
+
* // Find contacts in range
|
|
462
|
+
* console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
|
|
463
|
+
* // ['Alice', '555-0101'],
|
|
464
|
+
* // ['Bob', '555-0102']
|
|
465
|
+
* // ];
|
|
517
466
|
*/
|
|
518
|
-
|
|
519
|
-
this
|
|
467
|
+
set(key: K, value: V | undefined): this {
|
|
468
|
+
this._validateKey(key);
|
|
469
|
+
this.#core.set(key, value as V);
|
|
470
|
+
return this;
|
|
520
471
|
}
|
|
521
472
|
|
|
522
473
|
/**
|
|
523
|
-
*
|
|
474
|
+
* Get the value under a key.
|
|
475
|
+
* @remarks Expected time O(log n)
|
|
476
|
+
|
|
477
|
+
|
|
524
478
|
|
|
525
479
|
|
|
526
480
|
|
|
@@ -559,25 +513,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
559
513
|
|
|
560
514
|
|
|
561
515
|
|
|
562
|
-
* @example
|
|
563
|
-
* // Get sorted keys
|
|
564
|
-
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
|
|
565
|
-
* console.log([...tm.keys()]); // [1, 3];
|
|
566
|
-
*/
|
|
567
|
-
keys(): IterableIterator<K> {
|
|
568
|
-
return this.#core.keys();
|
|
569
|
-
}
|
|
570
|
-
|
|
571
|
-
private _entryFromKey(k: K): [K, V | undefined] {
|
|
572
|
-
// Keys come from `keys()` which only yields existing keys.
|
|
573
|
-
// We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
|
|
574
|
-
return [k, this.#core.get(k)];
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
/**
|
|
578
|
-
* Iterate over values in ascending key order.
|
|
579
|
-
*
|
|
580
|
-
* Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
|
|
581
516
|
|
|
582
517
|
|
|
583
518
|
|
|
@@ -616,19 +551,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
616
551
|
|
|
617
552
|
|
|
618
553
|
|
|
619
|
-
* @example
|
|
620
|
-
* // Get values in key order
|
|
621
|
-
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
622
|
-
* console.log([...tm.values()]); // ['a', 'b'];
|
|
623
|
-
*/
|
|
624
|
-
*values(): IterableIterator<V | undefined> {
|
|
625
|
-
for (const k of this.keys()) yield this._entryFromKey(k)[1];
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
/**
|
|
629
|
-
* Iterate over `[key, value]` entries in ascending key order.
|
|
630
|
-
*
|
|
631
|
-
* Note: values may be `undefined`.
|
|
632
554
|
|
|
633
555
|
|
|
634
556
|
|
|
@@ -667,23 +589,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
667
589
|
|
|
668
590
|
|
|
669
591
|
|
|
670
|
-
* @example
|
|
671
|
-
* // Iterate key-value pairs
|
|
672
|
-
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
|
|
673
|
-
* console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
|
|
674
|
-
*/
|
|
675
|
-
*entries(): IterableIterator<[K, V | undefined]> {
|
|
676
|
-
for (const k of this.keys()) yield this._entryFromKey(k);
|
|
677
|
-
}
|
|
678
|
-
|
|
679
|
-
[Symbol.iterator](): IterableIterator<[K, V | undefined]> {
|
|
680
|
-
return this.entries();
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
/**
|
|
684
|
-
* Visit each entry in ascending key order.
|
|
685
|
-
*
|
|
686
|
-
* Note: callback value may be `undefined`.
|
|
687
592
|
|
|
688
593
|
|
|
689
594
|
|
|
@@ -723,21 +628,29 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
723
628
|
|
|
724
629
|
|
|
725
630
|
* @example
|
|
726
|
-
* //
|
|
727
|
-
* const
|
|
728
|
-
*
|
|
729
|
-
*
|
|
730
|
-
*
|
|
631
|
+
* // Configuration registry with typed lookups
|
|
632
|
+
* const config = new TreeMap<string, number>([
|
|
633
|
+
* ['maxRetries', 3],
|
|
634
|
+
* ['timeout', 5000],
|
|
635
|
+
* ['poolSize', 10]
|
|
636
|
+
* ]);
|
|
637
|
+
*
|
|
638
|
+
* console.log(config.get('timeout')); // 5000;
|
|
639
|
+
* console.log(config.get('missing')); // undefined;
|
|
640
|
+
* console.log(config.size); // 3;
|
|
731
641
|
*/
|
|
732
|
-
|
|
733
|
-
|
|
642
|
+
get(key: K): V | undefined {
|
|
643
|
+
this._validateKey(key);
|
|
644
|
+
return this.#core.get(key);
|
|
734
645
|
}
|
|
735
646
|
|
|
736
647
|
/**
|
|
737
|
-
*
|
|
738
|
-
*
|
|
739
|
-
|
|
740
|
-
|
|
648
|
+
* Test whether a key exists.
|
|
649
|
+
* @remarks Expected time O(log n)
|
|
650
|
+
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
|
|
741
654
|
|
|
742
655
|
|
|
743
656
|
|
|
@@ -776,31 +689,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
776
689
|
|
|
777
690
|
|
|
778
691
|
|
|
779
|
-
* @example
|
|
780
|
-
* // Transform entries
|
|
781
|
-
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
782
|
-
* const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
|
|
783
|
-
* console.log([...doubled.values()]); // [20, 40];
|
|
784
|
-
*/
|
|
785
|
-
map<MK, MV>(
|
|
786
|
-
callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
|
|
787
|
-
options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
788
|
-
thisArg?: unknown
|
|
789
|
-
): TreeMap<MK, MV> {
|
|
790
|
-
const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
|
|
791
|
-
let index = 0;
|
|
792
|
-
for (const [k, v] of this) {
|
|
793
|
-
const [mk, mv] = thisArg === undefined
|
|
794
|
-
? callbackfn(v, k, index++, this)
|
|
795
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
|
|
796
|
-
out.set(mk, mv);
|
|
797
|
-
}
|
|
798
|
-
return out;
|
|
799
|
-
}
|
|
800
|
-
|
|
801
|
-
/**
|
|
802
|
-
* Create a new TreeMap containing only entries that satisfy the predicate.
|
|
803
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
804
692
|
|
|
805
693
|
|
|
806
694
|
|
|
@@ -839,27 +727,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
839
727
|
|
|
840
728
|
|
|
841
729
|
|
|
842
|
-
* @example
|
|
843
|
-
* // Filter entries
|
|
844
|
-
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
|
|
845
|
-
* const filtered = tm.filter((v, k) => k > 1);
|
|
846
|
-
* console.log([...filtered.keys()]); // [2, 3];
|
|
847
|
-
*/
|
|
848
|
-
filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
|
|
849
|
-
const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
|
|
850
|
-
let index = 0;
|
|
851
|
-
for (const [k, v] of this) {
|
|
852
|
-
const ok = thisArg === undefined
|
|
853
|
-
? callbackfn(v, k, index++, this)
|
|
854
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
855
|
-
if (ok) out.set(k, v);
|
|
856
|
-
}
|
|
857
|
-
return out;
|
|
858
|
-
}
|
|
859
|
-
|
|
860
|
-
/**
|
|
861
|
-
* Reduce entries into a single accumulator.
|
|
862
|
-
* @remarks Time O(n), Space O(1)
|
|
863
730
|
|
|
864
731
|
|
|
865
732
|
|
|
@@ -898,21 +765,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
898
765
|
|
|
899
766
|
|
|
900
767
|
|
|
901
|
-
* @example
|
|
902
|
-
* // Aggregate values
|
|
903
|
-
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
904
|
-
* console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
|
|
905
|
-
*/
|
|
906
|
-
reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
|
|
907
|
-
let acc = initialValue;
|
|
908
|
-
let index = 0;
|
|
909
|
-
for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
|
|
910
|
-
return acc;
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
/**
|
|
914
|
-
* Test whether all entries satisfy a predicate.
|
|
915
|
-
* @remarks Time O(n), Space O(1)
|
|
916
768
|
|
|
917
769
|
|
|
918
770
|
|
|
@@ -950,24 +802,31 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
950
802
|
|
|
951
803
|
|
|
952
804
|
* @example
|
|
953
|
-
* //
|
|
954
|
-
* const
|
|
955
|
-
*
|
|
805
|
+
* // Feature flag checking
|
|
806
|
+
* const flags = new TreeMap<string, boolean>([
|
|
807
|
+
* ['darkMode', true],
|
|
808
|
+
* ['betaFeature', false],
|
|
809
|
+
* ['notifications', true]
|
|
810
|
+
* ]);
|
|
811
|
+
*
|
|
812
|
+
* console.log(flags.has('darkMode')); // true;
|
|
813
|
+
* console.log(flags.has('unknownFlag')); // false;
|
|
956
814
|
*/
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
const ok = thisArg === undefined
|
|
961
|
-
? callbackfn(v, k, index++, this)
|
|
962
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
963
|
-
if (!ok) return false;
|
|
964
|
-
}
|
|
965
|
-
return true;
|
|
815
|
+
has(key: K): boolean {
|
|
816
|
+
this._validateKey(key);
|
|
817
|
+
return this.#core.has(key);
|
|
966
818
|
}
|
|
967
819
|
|
|
968
820
|
/**
|
|
969
|
-
*
|
|
970
|
-
* @
|
|
821
|
+
* Delete a key.
|
|
822
|
+
* @returns `true` if the key existed; otherwise `false`.
|
|
823
|
+
* @remarks Expected time O(log n)
|
|
824
|
+
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
|
|
971
830
|
|
|
972
831
|
|
|
973
832
|
|
|
@@ -1004,26 +863,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1004
863
|
|
|
1005
864
|
|
|
1006
865
|
|
|
1007
|
-
* @example
|
|
1008
|
-
* // Test any entry
|
|
1009
|
-
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
1010
|
-
* console.log(tm.some((v, k) => k === 2)); // true;
|
|
1011
|
-
*/
|
|
1012
|
-
some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
|
|
1013
|
-
let index = 0;
|
|
1014
|
-
for (const [k, v] of this) {
|
|
1015
|
-
const ok = thisArg === undefined
|
|
1016
|
-
? callbackfn(v, k, index++, this)
|
|
1017
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
1018
|
-
if (ok) return true;
|
|
1019
|
-
}
|
|
1020
|
-
return false;
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
/**
|
|
1024
|
-
* Find the first entry that satisfies a predicate.
|
|
1025
|
-
* @returns The first matching `[key, value]` tuple, or `undefined`.
|
|
1026
|
-
* @remarks Time O(n), Space O(1)
|
|
1027
866
|
|
|
1028
867
|
|
|
1029
868
|
|
|
@@ -1060,25 +899,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1060
899
|
|
|
1061
900
|
|
|
1062
901
|
|
|
1063
|
-
* @example
|
|
1064
|
-
* // Find matching entry
|
|
1065
|
-
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
1066
|
-
* console.log(tm.find(v => v === 'b')?.[0]); // 2;
|
|
1067
|
-
*/
|
|
1068
|
-
find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
|
|
1069
|
-
let index = 0;
|
|
1070
|
-
for (const [k, v] of this) {
|
|
1071
|
-
const ok = thisArg === undefined
|
|
1072
|
-
? callbackfn(v, k, index++, this)
|
|
1073
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
1074
|
-
if (ok) return [k, v];
|
|
1075
|
-
}
|
|
1076
|
-
return undefined;
|
|
1077
|
-
}
|
|
1078
|
-
|
|
1079
|
-
/**
|
|
1080
|
-
* Materialize the map into an array of `[key, value]` tuples.
|
|
1081
|
-
* @remarks Time O(n), Space O(n)
|
|
1082
902
|
|
|
1083
903
|
|
|
1084
904
|
|
|
@@ -1117,18 +937,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1117
937
|
|
|
1118
938
|
|
|
1119
939
|
|
|
1120
|
-
* @example
|
|
1121
|
-
* // Convert to array
|
|
1122
|
-
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
1123
|
-
* console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
|
|
1124
|
-
*/
|
|
1125
|
-
toArray(): Array<[K, V | undefined]> {
|
|
1126
|
-
return [...this];
|
|
1127
|
-
}
|
|
1128
|
-
|
|
1129
|
-
/**
|
|
1130
|
-
* Print a human-friendly representation.
|
|
1131
|
-
* @remarks Time O(n), Space O(n)
|
|
1132
940
|
|
|
1133
941
|
|
|
1134
942
|
|
|
@@ -1168,20 +976,26 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1168
976
|
|
|
1169
977
|
|
|
1170
978
|
* @example
|
|
1171
|
-
* //
|
|
1172
|
-
* const
|
|
1173
|
-
*
|
|
979
|
+
* // Session management with expiry
|
|
980
|
+
* const sessions = new TreeMap<string, number>([
|
|
981
|
+
* ['sess_abc', Date.now()],
|
|
982
|
+
* ['sess_def', Date.now()],
|
|
983
|
+
* ['sess_ghi', Date.now()]
|
|
984
|
+
* ]);
|
|
985
|
+
*
|
|
986
|
+
* console.log(sessions.size); // 3;
|
|
987
|
+
* sessions.delete('sess_def');
|
|
988
|
+
* console.log(sessions.has('sess_def')); // false;
|
|
989
|
+
* console.log(sessions.size); // 2;
|
|
1174
990
|
*/
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
this.#core.
|
|
991
|
+
delete(key: K): boolean {
|
|
992
|
+
this._validateKey(key);
|
|
993
|
+
const res = this.#core.delete(key);
|
|
994
|
+
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
1178
995
|
}
|
|
1179
996
|
|
|
1180
|
-
// Navigable operations (return entry tuples)
|
|
1181
|
-
// Note: returned tuple values may be `undefined`.
|
|
1182
|
-
|
|
1183
997
|
/**
|
|
1184
|
-
*
|
|
998
|
+
* Remove all entries.
|
|
1185
999
|
|
|
1186
1000
|
|
|
1187
1001
|
|
|
@@ -1193,40 +1007,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1193
1007
|
|
|
1194
1008
|
|
|
1195
1009
|
|
|
1196
|
-
* @example
|
|
1197
|
-
* // Leaderboard with ranked scores
|
|
1198
|
-
* // Use score as key (descending), player name as value
|
|
1199
|
-
* const leaderboard = new TreeMap<number, string>([], {
|
|
1200
|
-
* comparator: (a, b) => b - a // descending
|
|
1201
|
-
* });
|
|
1202
|
-
*
|
|
1203
|
-
* leaderboard.set(1500, 'Alice');
|
|
1204
|
-
* leaderboard.set(2200, 'Bob');
|
|
1205
|
-
* leaderboard.set(1800, 'Charlie');
|
|
1206
|
-
* leaderboard.set(2500, 'Diana');
|
|
1207
|
-
*
|
|
1208
|
-
* // Top 3 players (first 3 in descending order)
|
|
1209
|
-
* const top3 = [...leaderboard.entries()].slice(0, 3);
|
|
1210
|
-
* console.log(top3); // [
|
|
1211
|
-
* // [2500, 'Diana'],
|
|
1212
|
-
* // [2200, 'Bob'],
|
|
1213
|
-
* // [1800, 'Charlie']
|
|
1214
|
-
* // ];
|
|
1215
|
-
*
|
|
1216
|
-
* // Highest scorer
|
|
1217
|
-
* console.log(leaderboard.first()); // [2500, 'Diana'];
|
|
1218
|
-
*
|
|
1219
|
-
* // Remove lowest scorer
|
|
1220
|
-
* console.log(leaderboard.pollLast()); // [1500, 'Alice'];
|
|
1221
|
-
* console.log(leaderboard.size); // 3;
|
|
1222
|
-
*/
|
|
1223
|
-
first(): [K, V | undefined] | undefined {
|
|
1224
|
-
const k = this.#core.getLeftMost();
|
|
1225
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1226
|
-
}
|
|
1227
|
-
|
|
1228
|
-
/**
|
|
1229
|
-
* Largest entry by key.
|
|
1230
1010
|
|
|
1231
1011
|
|
|
1232
1012
|
|
|
@@ -1238,24 +1018,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1238
1018
|
|
|
1239
1019
|
|
|
1240
1020
|
|
|
1241
|
-
* @example
|
|
1242
|
-
* // Access the maximum entry
|
|
1243
|
-
* const scores = new TreeMap<number, string>([
|
|
1244
|
-
* [85, 'Bob'],
|
|
1245
|
-
* [92, 'Alice'],
|
|
1246
|
-
* [78, 'Charlie']
|
|
1247
|
-
* ]);
|
|
1248
|
-
*
|
|
1249
|
-
* console.log(scores.last()); // [92, 'Alice'];
|
|
1250
|
-
* console.log(scores.first()); // [78, 'Charlie'];
|
|
1251
|
-
*/
|
|
1252
|
-
last(): [K, V | undefined] | undefined {
|
|
1253
|
-
const k = this.#core.getRightMost();
|
|
1254
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1255
|
-
}
|
|
1256
|
-
|
|
1257
|
-
/**
|
|
1258
|
-
* Remove and return the smallest entry.
|
|
1259
1021
|
|
|
1260
1022
|
|
|
1261
1023
|
|
|
@@ -1267,28 +1029,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1267
1029
|
|
|
1268
1030
|
|
|
1269
1031
|
|
|
1270
|
-
* @example
|
|
1271
|
-
* // Process items from lowest priority
|
|
1272
|
-
* const tasks = new TreeMap<number, string>([
|
|
1273
|
-
* [3, 'Low'],
|
|
1274
|
-
* [1, 'Critical'],
|
|
1275
|
-
* [2, 'Medium']
|
|
1276
|
-
* ]);
|
|
1277
|
-
*
|
|
1278
|
-
* // Process lowest priority first
|
|
1279
|
-
* console.log(tasks.pollFirst()); // [1, 'Critical'];
|
|
1280
|
-
* console.log(tasks.pollFirst()); // [2, 'Medium'];
|
|
1281
|
-
* console.log(tasks.size); // 1;
|
|
1282
|
-
*/
|
|
1283
|
-
pollFirst(): [K, V | undefined] | undefined {
|
|
1284
|
-
const entry = this.first();
|
|
1285
|
-
if (!entry) return undefined;
|
|
1286
|
-
this.delete(entry[0]);
|
|
1287
|
-
return entry;
|
|
1288
|
-
}
|
|
1289
|
-
|
|
1290
|
-
/**
|
|
1291
|
-
* Remove and return the largest entry.
|
|
1292
1032
|
|
|
1293
1033
|
|
|
1294
1034
|
|
|
@@ -1300,28 +1040,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1300
1040
|
|
|
1301
1041
|
|
|
1302
1042
|
|
|
1303
|
-
* @example
|
|
1304
|
-
* // Remove the maximum entry
|
|
1305
|
-
* const bids = new TreeMap<number, string>([
|
|
1306
|
-
* [100, 'Alice'],
|
|
1307
|
-
* [150, 'Bob'],
|
|
1308
|
-
* [120, 'Charlie']
|
|
1309
|
-
* ]);
|
|
1310
|
-
*
|
|
1311
|
-
* // Remove highest bid
|
|
1312
|
-
* console.log(bids.pollLast()); // [150, 'Bob'];
|
|
1313
|
-
* console.log(bids.size); // 2;
|
|
1314
|
-
* console.log(bids.last()); // [120, 'Charlie'];
|
|
1315
|
-
*/
|
|
1316
|
-
pollLast(): [K, V | undefined] | undefined {
|
|
1317
|
-
const entry = this.last();
|
|
1318
|
-
if (!entry) return undefined;
|
|
1319
|
-
this.delete(entry[0]);
|
|
1320
|
-
return entry;
|
|
1321
|
-
}
|
|
1322
|
-
|
|
1323
|
-
/**
|
|
1324
|
-
* Smallest entry whose key is >= the given key.
|
|
1325
1043
|
|
|
1326
1044
|
|
|
1327
1045
|
|
|
@@ -1360,11 +1078,2351 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1360
1078
|
|
|
1361
1079
|
|
|
1362
1080
|
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1081
|
+
|
|
1082
|
+
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
|
|
1088
|
+
|
|
1089
|
+
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
|
|
1093
|
+
|
|
1094
|
+
|
|
1095
|
+
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
|
|
1099
|
+
|
|
1100
|
+
|
|
1101
|
+
|
|
1102
|
+
|
|
1103
|
+
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
|
|
1107
|
+
|
|
1108
|
+
|
|
1109
|
+
|
|
1110
|
+
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
|
|
1114
|
+
|
|
1115
|
+
|
|
1116
|
+
|
|
1117
|
+
|
|
1118
|
+
|
|
1119
|
+
|
|
1120
|
+
|
|
1121
|
+
|
|
1122
|
+
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
|
|
1127
|
+
|
|
1128
|
+
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
|
|
1136
|
+
|
|
1137
|
+
|
|
1138
|
+
|
|
1139
|
+
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
* @example
|
|
1143
|
+
* // Remove all
|
|
1144
|
+
* const tm = new TreeMap<number, string>([[1, 'a']]);
|
|
1145
|
+
* tm.clear();
|
|
1146
|
+
* console.log(tm.isEmpty()); // true;
|
|
1147
|
+
*/
|
|
1148
|
+
clear(): void {
|
|
1149
|
+
this.#core.clear();
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
/**
|
|
1153
|
+
* Iterate over keys in ascending order.
|
|
1154
|
+
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
|
|
1247
|
+
|
|
1248
|
+
|
|
1249
|
+
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
|
|
1297
|
+
* @example
|
|
1298
|
+
* // Get sorted keys
|
|
1299
|
+
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
|
|
1300
|
+
* console.log([...tm.keys()]); // [1, 3];
|
|
1301
|
+
*/
|
|
1302
|
+
keys(): IterableIterator<K> {
|
|
1303
|
+
return this.#core.keys();
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
private _entryFromKey(k: K): [K, V | undefined] {
|
|
1307
|
+
// Keys come from `keys()` which only yields existing keys.
|
|
1308
|
+
// We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
|
|
1309
|
+
return [k, this.#core.get(k)];
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
/**
|
|
1313
|
+
* Iterate over values in ascending key order.
|
|
1314
|
+
*
|
|
1315
|
+
* Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
|
|
1358
|
+
|
|
1359
|
+
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
|
|
1373
|
+
|
|
1374
|
+
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
|
|
1383
|
+
|
|
1384
|
+
|
|
1385
|
+
|
|
1386
|
+
|
|
1387
|
+
|
|
1388
|
+
|
|
1389
|
+
|
|
1390
|
+
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
|
|
1397
|
+
|
|
1398
|
+
|
|
1399
|
+
|
|
1400
|
+
|
|
1401
|
+
|
|
1402
|
+
|
|
1403
|
+
|
|
1404
|
+
|
|
1405
|
+
|
|
1406
|
+
|
|
1407
|
+
|
|
1408
|
+
|
|
1409
|
+
|
|
1410
|
+
|
|
1411
|
+
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
|
|
1419
|
+
|
|
1420
|
+
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
|
|
1459
|
+
* @example
|
|
1460
|
+
* // Get values in key order
|
|
1461
|
+
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
1462
|
+
* console.log([...tm.values()]); // ['a', 'b'];
|
|
1463
|
+
*/
|
|
1464
|
+
*values(): IterableIterator<V | undefined> {
|
|
1465
|
+
for (const k of this.keys()) yield this._entryFromKey(k)[1];
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1468
|
+
/**
|
|
1469
|
+
* Iterate over `[key, value]` entries in ascending key order.
|
|
1470
|
+
*
|
|
1471
|
+
* Note: values may be `undefined`.
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
|
|
1528
|
+
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
|
|
1556
|
+
|
|
1557
|
+
|
|
1558
|
+
|
|
1559
|
+
|
|
1560
|
+
|
|
1561
|
+
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
|
|
1615
|
+
* @example
|
|
1616
|
+
* // Iterate key-value pairs
|
|
1617
|
+
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
|
|
1618
|
+
* console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
|
|
1619
|
+
*/
|
|
1620
|
+
*entries(): IterableIterator<[K, V | undefined]> {
|
|
1621
|
+
for (const k of this.keys()) yield this._entryFromKey(k);
|
|
1622
|
+
}
|
|
1623
|
+
|
|
1624
|
+
[Symbol.iterator](): IterableIterator<[K, V | undefined]> {
|
|
1625
|
+
return this.entries();
|
|
1626
|
+
}
|
|
1627
|
+
|
|
1628
|
+
/**
|
|
1629
|
+
* Visit each entry in ascending key order.
|
|
1630
|
+
*
|
|
1631
|
+
* Note: callback value may be `undefined`.
|
|
1632
|
+
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
|
|
1639
|
+
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
|
|
1654
|
+
|
|
1655
|
+
|
|
1656
|
+
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
|
|
1660
|
+
|
|
1661
|
+
|
|
1662
|
+
|
|
1663
|
+
|
|
1664
|
+
|
|
1665
|
+
|
|
1666
|
+
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
|
|
1677
|
+
|
|
1678
|
+
|
|
1679
|
+
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
|
|
1698
|
+
|
|
1699
|
+
|
|
1700
|
+
|
|
1701
|
+
|
|
1702
|
+
|
|
1703
|
+
|
|
1704
|
+
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
|
|
1708
|
+
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
|
|
1733
|
+
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
|
|
1740
|
+
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
|
|
1744
|
+
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
|
|
1750
|
+
|
|
1751
|
+
|
|
1752
|
+
|
|
1753
|
+
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
|
|
1757
|
+
|
|
1758
|
+
|
|
1759
|
+
|
|
1760
|
+
|
|
1761
|
+
|
|
1762
|
+
|
|
1763
|
+
|
|
1764
|
+
|
|
1765
|
+
|
|
1766
|
+
|
|
1767
|
+
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
|
|
1775
|
+
* @example
|
|
1776
|
+
* // Execute for each entry
|
|
1777
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
1778
|
+
* const pairs: string[] = [];
|
|
1779
|
+
* tm.forEach((v, k) => pairs.push(`${k}:${v}`));
|
|
1780
|
+
* console.log(pairs); // ['1:a', '2:b'];
|
|
1781
|
+
*/
|
|
1782
|
+
forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: unknown): void {
|
|
1783
|
+
for (const [k, v] of this) cb.call(thisArg, v, k, this);
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
/**
|
|
1787
|
+
* Create a new TreeMap by mapping each entry to a new `[key, value]` entry.
|
|
1788
|
+
*
|
|
1789
|
+
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
1790
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1791
|
+
|
|
1792
|
+
|
|
1793
|
+
|
|
1794
|
+
|
|
1795
|
+
|
|
1796
|
+
|
|
1797
|
+
|
|
1798
|
+
|
|
1799
|
+
|
|
1800
|
+
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
|
|
1812
|
+
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
|
|
1816
|
+
|
|
1817
|
+
|
|
1818
|
+
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
|
|
1834
|
+
|
|
1835
|
+
|
|
1836
|
+
|
|
1837
|
+
|
|
1838
|
+
|
|
1839
|
+
|
|
1840
|
+
|
|
1841
|
+
|
|
1842
|
+
|
|
1843
|
+
|
|
1844
|
+
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
|
|
1848
|
+
|
|
1849
|
+
|
|
1850
|
+
|
|
1851
|
+
|
|
1852
|
+
|
|
1853
|
+
|
|
1854
|
+
|
|
1855
|
+
|
|
1856
|
+
|
|
1857
|
+
|
|
1858
|
+
|
|
1859
|
+
|
|
1860
|
+
|
|
1861
|
+
|
|
1862
|
+
|
|
1863
|
+
|
|
1864
|
+
|
|
1865
|
+
|
|
1866
|
+
|
|
1867
|
+
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
|
|
1871
|
+
|
|
1872
|
+
|
|
1873
|
+
|
|
1874
|
+
|
|
1875
|
+
|
|
1876
|
+
|
|
1877
|
+
|
|
1878
|
+
|
|
1879
|
+
|
|
1880
|
+
|
|
1881
|
+
|
|
1882
|
+
|
|
1883
|
+
|
|
1884
|
+
|
|
1885
|
+
|
|
1886
|
+
|
|
1887
|
+
|
|
1888
|
+
|
|
1889
|
+
|
|
1890
|
+
|
|
1891
|
+
|
|
1892
|
+
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
|
|
1896
|
+
|
|
1897
|
+
|
|
1898
|
+
|
|
1899
|
+
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
|
|
1903
|
+
|
|
1904
|
+
|
|
1905
|
+
|
|
1906
|
+
|
|
1907
|
+
|
|
1908
|
+
|
|
1909
|
+
|
|
1910
|
+
|
|
1911
|
+
|
|
1912
|
+
|
|
1913
|
+
|
|
1914
|
+
|
|
1915
|
+
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
|
|
1919
|
+
|
|
1920
|
+
|
|
1921
|
+
|
|
1922
|
+
|
|
1923
|
+
|
|
1924
|
+
|
|
1925
|
+
|
|
1926
|
+
|
|
1927
|
+
|
|
1928
|
+
|
|
1929
|
+
|
|
1930
|
+
|
|
1931
|
+
|
|
1932
|
+
|
|
1933
|
+
|
|
1934
|
+
* @example
|
|
1935
|
+
* // Transform entries
|
|
1936
|
+
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
1937
|
+
* const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
|
|
1938
|
+
* console.log([...doubled.values()]); // [20, 40];
|
|
1939
|
+
*/
|
|
1940
|
+
map<MK, MV>(
|
|
1941
|
+
callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
|
|
1942
|
+
options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
1943
|
+
thisArg?: unknown
|
|
1944
|
+
): TreeMap<MK, MV> {
|
|
1945
|
+
const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
|
|
1946
|
+
let index = 0;
|
|
1947
|
+
for (const [k, v] of this) {
|
|
1948
|
+
const [mk, mv] = thisArg === undefined
|
|
1949
|
+
? callbackfn(v, k, index++, this)
|
|
1950
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
|
|
1951
|
+
out.set(mk, mv);
|
|
1952
|
+
}
|
|
1953
|
+
return out;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
/**
|
|
1957
|
+
* Create a new TreeMap containing only entries that satisfy the predicate.
|
|
1958
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1959
|
+
|
|
1960
|
+
|
|
1961
|
+
|
|
1962
|
+
|
|
1963
|
+
|
|
1964
|
+
|
|
1965
|
+
|
|
1966
|
+
|
|
1967
|
+
|
|
1968
|
+
|
|
1969
|
+
|
|
1970
|
+
|
|
1971
|
+
|
|
1972
|
+
|
|
1973
|
+
|
|
1974
|
+
|
|
1975
|
+
|
|
1976
|
+
|
|
1977
|
+
|
|
1978
|
+
|
|
1979
|
+
|
|
1980
|
+
|
|
1981
|
+
|
|
1982
|
+
|
|
1983
|
+
|
|
1984
|
+
|
|
1985
|
+
|
|
1986
|
+
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
|
|
1993
|
+
|
|
1994
|
+
|
|
1995
|
+
|
|
1996
|
+
|
|
1997
|
+
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
|
|
2001
|
+
|
|
2002
|
+
|
|
2003
|
+
|
|
2004
|
+
|
|
2005
|
+
|
|
2006
|
+
|
|
2007
|
+
|
|
2008
|
+
|
|
2009
|
+
|
|
2010
|
+
|
|
2011
|
+
|
|
2012
|
+
|
|
2013
|
+
|
|
2014
|
+
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
|
|
2018
|
+
|
|
2019
|
+
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
|
|
2029
|
+
|
|
2030
|
+
|
|
2031
|
+
|
|
2032
|
+
|
|
2033
|
+
|
|
2034
|
+
|
|
2035
|
+
|
|
2036
|
+
|
|
2037
|
+
|
|
2038
|
+
|
|
2039
|
+
|
|
2040
|
+
|
|
2041
|
+
|
|
2042
|
+
|
|
2043
|
+
|
|
2044
|
+
|
|
2045
|
+
|
|
2046
|
+
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
|
|
2050
|
+
|
|
2051
|
+
|
|
2052
|
+
|
|
2053
|
+
|
|
2054
|
+
|
|
2055
|
+
|
|
2056
|
+
|
|
2057
|
+
|
|
2058
|
+
|
|
2059
|
+
|
|
2060
|
+
|
|
2061
|
+
|
|
2062
|
+
|
|
2063
|
+
|
|
2064
|
+
|
|
2065
|
+
|
|
2066
|
+
|
|
2067
|
+
|
|
2068
|
+
|
|
2069
|
+
|
|
2070
|
+
|
|
2071
|
+
|
|
2072
|
+
|
|
2073
|
+
|
|
2074
|
+
|
|
2075
|
+
|
|
2076
|
+
|
|
2077
|
+
|
|
2078
|
+
|
|
2079
|
+
|
|
2080
|
+
|
|
2081
|
+
|
|
2082
|
+
|
|
2083
|
+
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
|
|
2091
|
+
|
|
2092
|
+
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
|
|
2096
|
+
|
|
2097
|
+
|
|
2098
|
+
|
|
2099
|
+
|
|
2100
|
+
|
|
2101
|
+
|
|
2102
|
+
* @example
|
|
2103
|
+
* // Filter entries
|
|
2104
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
|
|
2105
|
+
* const filtered = tm.filter((v, k) => k > 1);
|
|
2106
|
+
* console.log([...filtered.keys()]); // [2, 3];
|
|
2107
|
+
*/
|
|
2108
|
+
filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
|
|
2109
|
+
const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
|
|
2110
|
+
let index = 0;
|
|
2111
|
+
for (const [k, v] of this) {
|
|
2112
|
+
const ok = thisArg === undefined
|
|
2113
|
+
? callbackfn(v, k, index++, this)
|
|
2114
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2115
|
+
if (ok) out.set(k, v);
|
|
2116
|
+
}
|
|
2117
|
+
return out;
|
|
2118
|
+
}
|
|
2119
|
+
|
|
2120
|
+
/**
|
|
2121
|
+
* Reduce entries into a single accumulator.
|
|
2122
|
+
* @remarks Time O(n), Space O(1)
|
|
2123
|
+
|
|
2124
|
+
|
|
2125
|
+
|
|
2126
|
+
|
|
2127
|
+
|
|
2128
|
+
|
|
2129
|
+
|
|
2130
|
+
|
|
2131
|
+
|
|
2132
|
+
|
|
2133
|
+
|
|
2134
|
+
|
|
2135
|
+
|
|
2136
|
+
|
|
2137
|
+
|
|
2138
|
+
|
|
2139
|
+
|
|
2140
|
+
|
|
2141
|
+
|
|
2142
|
+
|
|
2143
|
+
|
|
2144
|
+
|
|
2145
|
+
|
|
2146
|
+
|
|
2147
|
+
|
|
2148
|
+
|
|
2149
|
+
|
|
2150
|
+
|
|
2151
|
+
|
|
2152
|
+
|
|
2153
|
+
|
|
2154
|
+
|
|
2155
|
+
|
|
2156
|
+
|
|
2157
|
+
|
|
2158
|
+
|
|
2159
|
+
|
|
2160
|
+
|
|
2161
|
+
|
|
2162
|
+
|
|
2163
|
+
|
|
2164
|
+
|
|
2165
|
+
|
|
2166
|
+
|
|
2167
|
+
|
|
2168
|
+
|
|
2169
|
+
|
|
2170
|
+
|
|
2171
|
+
|
|
2172
|
+
|
|
2173
|
+
|
|
2174
|
+
|
|
2175
|
+
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
|
|
2182
|
+
|
|
2183
|
+
|
|
2184
|
+
|
|
2185
|
+
|
|
2186
|
+
|
|
2187
|
+
|
|
2188
|
+
|
|
2189
|
+
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
|
|
2193
|
+
|
|
2194
|
+
|
|
2195
|
+
|
|
2196
|
+
|
|
2197
|
+
|
|
2198
|
+
|
|
2199
|
+
|
|
2200
|
+
|
|
2201
|
+
|
|
2202
|
+
|
|
2203
|
+
|
|
2204
|
+
|
|
2205
|
+
|
|
2206
|
+
|
|
2207
|
+
|
|
2208
|
+
|
|
2209
|
+
|
|
2210
|
+
|
|
2211
|
+
|
|
2212
|
+
|
|
2213
|
+
|
|
2214
|
+
|
|
2215
|
+
|
|
2216
|
+
|
|
2217
|
+
|
|
2218
|
+
|
|
2219
|
+
|
|
2220
|
+
|
|
2221
|
+
|
|
2222
|
+
|
|
2223
|
+
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
|
|
2227
|
+
|
|
2228
|
+
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
|
|
2232
|
+
|
|
2233
|
+
|
|
2234
|
+
|
|
2235
|
+
|
|
2236
|
+
|
|
2237
|
+
|
|
2238
|
+
|
|
2239
|
+
|
|
2240
|
+
|
|
2241
|
+
|
|
2242
|
+
|
|
2243
|
+
|
|
2244
|
+
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
|
|
2249
|
+
|
|
2250
|
+
|
|
2251
|
+
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
|
|
2255
|
+
|
|
2256
|
+
|
|
2257
|
+
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
|
|
2261
|
+
|
|
2262
|
+
|
|
2263
|
+
|
|
2264
|
+
|
|
2265
|
+
|
|
2266
|
+
* @example
|
|
2267
|
+
* // Aggregate values
|
|
2268
|
+
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
2269
|
+
* console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
|
|
2270
|
+
*/
|
|
2271
|
+
reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
|
|
2272
|
+
let acc = initialValue;
|
|
2273
|
+
let index = 0;
|
|
2274
|
+
for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
|
|
2275
|
+
return acc;
|
|
2276
|
+
}
|
|
2277
|
+
|
|
2278
|
+
/**
|
|
2279
|
+
* Test whether all entries satisfy a predicate.
|
|
2280
|
+
* @remarks Time O(n), Space O(1)
|
|
2281
|
+
|
|
2282
|
+
|
|
2283
|
+
|
|
2284
|
+
|
|
2285
|
+
|
|
2286
|
+
|
|
2287
|
+
|
|
2288
|
+
|
|
2289
|
+
|
|
2290
|
+
|
|
2291
|
+
|
|
2292
|
+
|
|
2293
|
+
|
|
2294
|
+
|
|
2295
|
+
|
|
2296
|
+
|
|
2297
|
+
|
|
2298
|
+
|
|
2299
|
+
|
|
2300
|
+
|
|
2301
|
+
|
|
2302
|
+
|
|
2303
|
+
|
|
2304
|
+
|
|
2305
|
+
|
|
2306
|
+
|
|
2307
|
+
|
|
2308
|
+
|
|
2309
|
+
|
|
2310
|
+
|
|
2311
|
+
|
|
2312
|
+
|
|
2313
|
+
|
|
2314
|
+
|
|
2315
|
+
|
|
2316
|
+
|
|
2317
|
+
|
|
2318
|
+
|
|
2319
|
+
|
|
2320
|
+
|
|
2321
|
+
|
|
2322
|
+
|
|
2323
|
+
|
|
2324
|
+
|
|
2325
|
+
|
|
2326
|
+
|
|
2327
|
+
|
|
2328
|
+
|
|
2329
|
+
|
|
2330
|
+
|
|
2331
|
+
|
|
2332
|
+
|
|
2333
|
+
|
|
2334
|
+
|
|
2335
|
+
|
|
2336
|
+
|
|
2337
|
+
|
|
2338
|
+
|
|
2339
|
+
|
|
2340
|
+
|
|
2341
|
+
|
|
2342
|
+
|
|
2343
|
+
|
|
2344
|
+
|
|
2345
|
+
|
|
2346
|
+
|
|
2347
|
+
|
|
2348
|
+
|
|
2349
|
+
|
|
2350
|
+
|
|
2351
|
+
|
|
2352
|
+
|
|
2353
|
+
|
|
2354
|
+
|
|
2355
|
+
|
|
2356
|
+
|
|
2357
|
+
|
|
2358
|
+
|
|
2359
|
+
|
|
2360
|
+
|
|
2361
|
+
|
|
2362
|
+
|
|
2363
|
+
|
|
2364
|
+
|
|
2365
|
+
|
|
2366
|
+
|
|
2367
|
+
|
|
2368
|
+
|
|
2369
|
+
|
|
2370
|
+
|
|
2371
|
+
|
|
2372
|
+
|
|
2373
|
+
|
|
2374
|
+
|
|
2375
|
+
|
|
2376
|
+
|
|
2377
|
+
|
|
2378
|
+
|
|
2379
|
+
|
|
2380
|
+
|
|
2381
|
+
|
|
2382
|
+
|
|
2383
|
+
|
|
2384
|
+
|
|
2385
|
+
|
|
2386
|
+
|
|
2387
|
+
|
|
2388
|
+
|
|
2389
|
+
|
|
2390
|
+
|
|
2391
|
+
|
|
2392
|
+
|
|
2393
|
+
|
|
2394
|
+
|
|
2395
|
+
|
|
2396
|
+
|
|
2397
|
+
|
|
2398
|
+
|
|
2399
|
+
|
|
2400
|
+
|
|
2401
|
+
|
|
2402
|
+
|
|
2403
|
+
|
|
2404
|
+
|
|
2405
|
+
|
|
2406
|
+
|
|
2407
|
+
|
|
2408
|
+
|
|
2409
|
+
|
|
2410
|
+
|
|
2411
|
+
|
|
2412
|
+
|
|
2413
|
+
|
|
2414
|
+
|
|
2415
|
+
|
|
2416
|
+
|
|
2417
|
+
|
|
2418
|
+
|
|
2419
|
+
|
|
2420
|
+
|
|
2421
|
+
|
|
2422
|
+
* @example
|
|
2423
|
+
* // Test all entries
|
|
2424
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
2425
|
+
* console.log(tm.every((v, k) => k > 0)); // true;
|
|
2426
|
+
*/
|
|
2427
|
+
every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
|
|
2428
|
+
let index = 0;
|
|
2429
|
+
for (const [k, v] of this) {
|
|
2430
|
+
const ok = thisArg === undefined
|
|
2431
|
+
? callbackfn(v, k, index++, this)
|
|
2432
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2433
|
+
if (!ok) return false;
|
|
2434
|
+
}
|
|
2435
|
+
return true;
|
|
2436
|
+
}
|
|
2437
|
+
|
|
2438
|
+
/**
|
|
2439
|
+
* Test whether any entry satisfies a predicate.
|
|
2440
|
+
* @remarks Time O(n), Space O(1)
|
|
2441
|
+
|
|
2442
|
+
|
|
2443
|
+
|
|
2444
|
+
|
|
2445
|
+
|
|
2446
|
+
|
|
2447
|
+
|
|
2448
|
+
|
|
2449
|
+
|
|
2450
|
+
|
|
2451
|
+
|
|
2452
|
+
|
|
2453
|
+
|
|
2454
|
+
|
|
2455
|
+
|
|
2456
|
+
|
|
2457
|
+
|
|
2458
|
+
|
|
2459
|
+
|
|
2460
|
+
|
|
2461
|
+
|
|
2462
|
+
|
|
2463
|
+
|
|
2464
|
+
|
|
2465
|
+
|
|
2466
|
+
|
|
2467
|
+
|
|
2468
|
+
|
|
2469
|
+
|
|
2470
|
+
|
|
2471
|
+
|
|
2472
|
+
|
|
2473
|
+
|
|
2474
|
+
|
|
2475
|
+
|
|
2476
|
+
|
|
2477
|
+
|
|
2478
|
+
|
|
2479
|
+
|
|
2480
|
+
|
|
2481
|
+
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
|
|
2485
|
+
|
|
2486
|
+
|
|
2487
|
+
|
|
2488
|
+
|
|
2489
|
+
|
|
2490
|
+
|
|
2491
|
+
|
|
2492
|
+
|
|
2493
|
+
|
|
2494
|
+
|
|
2495
|
+
|
|
2496
|
+
|
|
2497
|
+
|
|
2498
|
+
|
|
2499
|
+
|
|
2500
|
+
|
|
2501
|
+
|
|
2502
|
+
|
|
2503
|
+
|
|
2504
|
+
|
|
2505
|
+
|
|
2506
|
+
|
|
2507
|
+
|
|
2508
|
+
|
|
2509
|
+
|
|
2510
|
+
|
|
2511
|
+
|
|
2512
|
+
|
|
2513
|
+
|
|
2514
|
+
|
|
2515
|
+
|
|
2516
|
+
|
|
2517
|
+
|
|
2518
|
+
|
|
2519
|
+
|
|
2520
|
+
|
|
2521
|
+
|
|
2522
|
+
|
|
2523
|
+
|
|
2524
|
+
|
|
2525
|
+
|
|
2526
|
+
|
|
2527
|
+
|
|
2528
|
+
|
|
2529
|
+
|
|
2530
|
+
|
|
2531
|
+
|
|
2532
|
+
|
|
2533
|
+
|
|
2534
|
+
|
|
2535
|
+
|
|
2536
|
+
|
|
2537
|
+
|
|
2538
|
+
|
|
2539
|
+
|
|
2540
|
+
|
|
2541
|
+
|
|
2542
|
+
|
|
2543
|
+
|
|
2544
|
+
|
|
2545
|
+
|
|
2546
|
+
|
|
2547
|
+
|
|
2548
|
+
|
|
2549
|
+
|
|
2550
|
+
|
|
2551
|
+
|
|
2552
|
+
|
|
2553
|
+
|
|
2554
|
+
|
|
2555
|
+
|
|
2556
|
+
|
|
2557
|
+
|
|
2558
|
+
|
|
2559
|
+
|
|
2560
|
+
|
|
2561
|
+
|
|
2562
|
+
|
|
2563
|
+
|
|
2564
|
+
|
|
2565
|
+
|
|
2566
|
+
|
|
2567
|
+
|
|
2568
|
+
|
|
2569
|
+
|
|
2570
|
+
|
|
2571
|
+
|
|
2572
|
+
|
|
2573
|
+
|
|
2574
|
+
|
|
2575
|
+
|
|
2576
|
+
|
|
2577
|
+
|
|
2578
|
+
|
|
2579
|
+
|
|
2580
|
+
|
|
2581
|
+
|
|
2582
|
+
* @example
|
|
2583
|
+
* // Test any entry
|
|
2584
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
2585
|
+
* console.log(tm.some((v, k) => k === 2)); // true;
|
|
2586
|
+
*/
|
|
2587
|
+
some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
|
|
2588
|
+
let index = 0;
|
|
2589
|
+
for (const [k, v] of this) {
|
|
2590
|
+
const ok = thisArg === undefined
|
|
2591
|
+
? callbackfn(v, k, index++, this)
|
|
2592
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2593
|
+
if (ok) return true;
|
|
2594
|
+
}
|
|
2595
|
+
return false;
|
|
2596
|
+
}
|
|
2597
|
+
|
|
2598
|
+
/**
|
|
2599
|
+
* Find the first entry that satisfies a predicate.
|
|
2600
|
+
* @returns The first matching `[key, value]` tuple, or `undefined`.
|
|
2601
|
+
* @remarks Time O(n), Space O(1)
|
|
2602
|
+
|
|
2603
|
+
|
|
2604
|
+
|
|
2605
|
+
|
|
2606
|
+
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
|
|
2610
|
+
|
|
2611
|
+
|
|
2612
|
+
|
|
2613
|
+
|
|
2614
|
+
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
|
|
2618
|
+
|
|
2619
|
+
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
|
|
2623
|
+
|
|
2624
|
+
|
|
2625
|
+
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
|
|
2629
|
+
|
|
2630
|
+
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
|
|
2634
|
+
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
|
|
2638
|
+
|
|
2639
|
+
|
|
2640
|
+
|
|
2641
|
+
|
|
2642
|
+
|
|
2643
|
+
|
|
2644
|
+
|
|
2645
|
+
|
|
2646
|
+
|
|
2647
|
+
|
|
2648
|
+
|
|
2649
|
+
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
|
|
2656
|
+
|
|
2657
|
+
|
|
2658
|
+
|
|
2659
|
+
|
|
2660
|
+
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
|
|
2668
|
+
|
|
2669
|
+
|
|
2670
|
+
|
|
2671
|
+
|
|
2672
|
+
|
|
2673
|
+
|
|
2674
|
+
|
|
2675
|
+
|
|
2676
|
+
|
|
2677
|
+
|
|
2678
|
+
|
|
2679
|
+
|
|
2680
|
+
|
|
2681
|
+
|
|
2682
|
+
|
|
2683
|
+
|
|
2684
|
+
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
|
|
2692
|
+
|
|
2693
|
+
|
|
2694
|
+
|
|
2695
|
+
|
|
2696
|
+
|
|
2697
|
+
|
|
2698
|
+
|
|
2699
|
+
|
|
2700
|
+
|
|
2701
|
+
|
|
2702
|
+
|
|
2703
|
+
|
|
2704
|
+
|
|
2705
|
+
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
|
|
2722
|
+
|
|
2723
|
+
|
|
2724
|
+
|
|
2725
|
+
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
|
|
2738
|
+
|
|
2739
|
+
|
|
2740
|
+
|
|
2741
|
+
|
|
2742
|
+
|
|
2743
|
+
* @example
|
|
2744
|
+
* // Find matching entry
|
|
2745
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
2746
|
+
* console.log(tm.find(v => v === 'b')?.[0]); // 2;
|
|
2747
|
+
*/
|
|
2748
|
+
find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
|
|
2749
|
+
let index = 0;
|
|
2750
|
+
for (const [k, v] of this) {
|
|
2751
|
+
const ok = thisArg === undefined
|
|
2752
|
+
? callbackfn(v, k, index++, this)
|
|
2753
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2754
|
+
if (ok) return [k, v];
|
|
2755
|
+
}
|
|
2756
|
+
return undefined;
|
|
2757
|
+
}
|
|
2758
|
+
|
|
2759
|
+
/**
|
|
2760
|
+
* Materialize the map into an array of `[key, value]` tuples.
|
|
2761
|
+
* @remarks Time O(n), Space O(n)
|
|
2762
|
+
|
|
2763
|
+
|
|
2764
|
+
|
|
2765
|
+
|
|
2766
|
+
|
|
2767
|
+
|
|
2768
|
+
|
|
2769
|
+
|
|
2770
|
+
|
|
2771
|
+
|
|
2772
|
+
|
|
2773
|
+
|
|
2774
|
+
|
|
2775
|
+
|
|
2776
|
+
|
|
2777
|
+
|
|
2778
|
+
|
|
2779
|
+
|
|
2780
|
+
|
|
2781
|
+
|
|
2782
|
+
|
|
2783
|
+
|
|
2784
|
+
|
|
2785
|
+
|
|
2786
|
+
|
|
2787
|
+
|
|
2788
|
+
|
|
2789
|
+
|
|
2790
|
+
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
|
|
2800
|
+
|
|
2801
|
+
|
|
2802
|
+
|
|
2803
|
+
|
|
2804
|
+
|
|
2805
|
+
|
|
2806
|
+
|
|
2807
|
+
|
|
2808
|
+
|
|
2809
|
+
|
|
2810
|
+
|
|
2811
|
+
|
|
2812
|
+
|
|
2813
|
+
|
|
2814
|
+
|
|
2815
|
+
|
|
2816
|
+
|
|
2817
|
+
|
|
2818
|
+
|
|
2819
|
+
|
|
2820
|
+
|
|
2821
|
+
|
|
2822
|
+
|
|
2823
|
+
|
|
2824
|
+
|
|
2825
|
+
|
|
2826
|
+
|
|
2827
|
+
|
|
2828
|
+
|
|
2829
|
+
|
|
2830
|
+
|
|
2831
|
+
|
|
2832
|
+
|
|
2833
|
+
|
|
2834
|
+
|
|
2835
|
+
|
|
2836
|
+
|
|
2837
|
+
|
|
2838
|
+
|
|
2839
|
+
|
|
2840
|
+
|
|
2841
|
+
|
|
2842
|
+
|
|
2843
|
+
|
|
2844
|
+
|
|
2845
|
+
|
|
2846
|
+
|
|
2847
|
+
|
|
2848
|
+
|
|
2849
|
+
|
|
2850
|
+
|
|
2851
|
+
|
|
2852
|
+
|
|
2853
|
+
|
|
2854
|
+
|
|
2855
|
+
|
|
2856
|
+
|
|
2857
|
+
|
|
2858
|
+
|
|
2859
|
+
|
|
2860
|
+
|
|
2861
|
+
|
|
2862
|
+
|
|
2863
|
+
|
|
2864
|
+
|
|
2865
|
+
|
|
2866
|
+
|
|
2867
|
+
|
|
2868
|
+
|
|
2869
|
+
|
|
2870
|
+
|
|
2871
|
+
|
|
2872
|
+
|
|
2873
|
+
|
|
2874
|
+
|
|
2875
|
+
|
|
2876
|
+
|
|
2877
|
+
|
|
2878
|
+
|
|
2879
|
+
|
|
2880
|
+
|
|
2881
|
+
|
|
2882
|
+
|
|
2883
|
+
|
|
2884
|
+
|
|
2885
|
+
|
|
2886
|
+
|
|
2887
|
+
|
|
2888
|
+
|
|
2889
|
+
|
|
2890
|
+
|
|
2891
|
+
|
|
2892
|
+
|
|
2893
|
+
|
|
2894
|
+
|
|
2895
|
+
|
|
2896
|
+
|
|
2897
|
+
|
|
2898
|
+
|
|
2899
|
+
|
|
2900
|
+
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
|
|
2904
|
+
|
|
2905
|
+
* @example
|
|
2906
|
+
* // Convert to array
|
|
2907
|
+
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
2908
|
+
* console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
|
|
2909
|
+
*/
|
|
2910
|
+
toArray(): Array<[K, V | undefined]> {
|
|
2911
|
+
return [...this];
|
|
2912
|
+
}
|
|
2913
|
+
|
|
2914
|
+
/**
|
|
2915
|
+
* Print a human-friendly representation.
|
|
2916
|
+
* @remarks Time O(n), Space O(n)
|
|
2917
|
+
|
|
2918
|
+
|
|
2919
|
+
|
|
2920
|
+
|
|
2921
|
+
|
|
2922
|
+
|
|
2923
|
+
|
|
2924
|
+
|
|
2925
|
+
|
|
2926
|
+
|
|
2927
|
+
|
|
2928
|
+
|
|
2929
|
+
|
|
2930
|
+
|
|
2931
|
+
|
|
2932
|
+
|
|
2933
|
+
|
|
2934
|
+
|
|
2935
|
+
|
|
2936
|
+
|
|
2937
|
+
|
|
2938
|
+
|
|
2939
|
+
|
|
2940
|
+
|
|
2941
|
+
|
|
2942
|
+
|
|
2943
|
+
|
|
2944
|
+
|
|
2945
|
+
|
|
2946
|
+
|
|
2947
|
+
|
|
2948
|
+
|
|
2949
|
+
|
|
2950
|
+
|
|
2951
|
+
|
|
2952
|
+
|
|
2953
|
+
|
|
2954
|
+
|
|
2955
|
+
|
|
2956
|
+
|
|
2957
|
+
|
|
2958
|
+
|
|
2959
|
+
|
|
2960
|
+
|
|
2961
|
+
|
|
2962
|
+
|
|
2963
|
+
|
|
2964
|
+
|
|
2965
|
+
|
|
2966
|
+
|
|
2967
|
+
|
|
2968
|
+
|
|
2969
|
+
|
|
2970
|
+
|
|
2971
|
+
|
|
2972
|
+
|
|
2973
|
+
|
|
2974
|
+
|
|
2975
|
+
|
|
2976
|
+
|
|
2977
|
+
|
|
2978
|
+
|
|
2979
|
+
|
|
2980
|
+
|
|
2981
|
+
|
|
2982
|
+
|
|
2983
|
+
|
|
2984
|
+
|
|
2985
|
+
|
|
2986
|
+
|
|
2987
|
+
|
|
2988
|
+
|
|
2989
|
+
|
|
2990
|
+
|
|
2991
|
+
|
|
2992
|
+
|
|
2993
|
+
|
|
2994
|
+
|
|
2995
|
+
|
|
2996
|
+
|
|
2997
|
+
|
|
2998
|
+
|
|
2999
|
+
|
|
3000
|
+
|
|
3001
|
+
|
|
3002
|
+
|
|
3003
|
+
|
|
3004
|
+
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
|
|
3008
|
+
|
|
3009
|
+
|
|
3010
|
+
|
|
3011
|
+
|
|
3012
|
+
|
|
3013
|
+
|
|
3014
|
+
|
|
3015
|
+
|
|
3016
|
+
|
|
3017
|
+
|
|
3018
|
+
|
|
3019
|
+
|
|
3020
|
+
|
|
3021
|
+
|
|
3022
|
+
|
|
3023
|
+
|
|
3024
|
+
|
|
3025
|
+
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
|
|
3029
|
+
|
|
3030
|
+
|
|
3031
|
+
|
|
3032
|
+
|
|
3033
|
+
|
|
3034
|
+
|
|
3035
|
+
|
|
3036
|
+
|
|
3037
|
+
|
|
3038
|
+
|
|
3039
|
+
|
|
3040
|
+
|
|
3041
|
+
|
|
3042
|
+
|
|
3043
|
+
|
|
3044
|
+
|
|
3045
|
+
|
|
3046
|
+
|
|
3047
|
+
|
|
3048
|
+
|
|
3049
|
+
|
|
3050
|
+
|
|
3051
|
+
|
|
3052
|
+
|
|
3053
|
+
|
|
3054
|
+
|
|
3055
|
+
|
|
3056
|
+
|
|
3057
|
+
|
|
3058
|
+
|
|
3059
|
+
|
|
3060
|
+
* @example
|
|
3061
|
+
* // Display tree
|
|
3062
|
+
* const tm = new TreeMap<number, string>([[1, 'a']]);
|
|
3063
|
+
* expect(() => tm.print()).not.toThrow();
|
|
3064
|
+
*/
|
|
3065
|
+
print(): void {
|
|
3066
|
+
// Delegate to the underlying tree's visualization.
|
|
3067
|
+
this.#core.print();
|
|
3068
|
+
}
|
|
3069
|
+
|
|
3070
|
+
// Navigable operations (return entry tuples)
|
|
3071
|
+
// Note: returned tuple values may be `undefined`.
|
|
3072
|
+
|
|
3073
|
+
/**
|
|
3074
|
+
* Smallest entry by key.
|
|
3075
|
+
|
|
3076
|
+
|
|
3077
|
+
|
|
3078
|
+
|
|
3079
|
+
|
|
3080
|
+
|
|
3081
|
+
|
|
3082
|
+
|
|
3083
|
+
|
|
3084
|
+
|
|
3085
|
+
|
|
3086
|
+
|
|
3087
|
+
|
|
3088
|
+
|
|
3089
|
+
|
|
3090
|
+
|
|
3091
|
+
|
|
3092
|
+
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
|
|
3096
|
+
|
|
3097
|
+
|
|
3098
|
+
|
|
3099
|
+
|
|
3100
|
+
|
|
3101
|
+
|
|
3102
|
+
|
|
3103
|
+
|
|
3104
|
+
|
|
3105
|
+
|
|
3106
|
+
|
|
3107
|
+
* @example
|
|
3108
|
+
* // Leaderboard with ranked scores
|
|
3109
|
+
* // Use score as key (descending), player name as value
|
|
3110
|
+
* const leaderboard = new TreeMap<number, string>([], {
|
|
3111
|
+
* comparator: (a, b) => b - a // descending
|
|
3112
|
+
* });
|
|
3113
|
+
*
|
|
3114
|
+
* leaderboard.set(1500, 'Alice');
|
|
3115
|
+
* leaderboard.set(2200, 'Bob');
|
|
3116
|
+
* leaderboard.set(1800, 'Charlie');
|
|
3117
|
+
* leaderboard.set(2500, 'Diana');
|
|
3118
|
+
*
|
|
3119
|
+
* // Top 3 players (first 3 in descending order)
|
|
3120
|
+
* const top3 = [...leaderboard.entries()].slice(0, 3);
|
|
3121
|
+
* console.log(top3); // [
|
|
3122
|
+
* // [2500, 'Diana'],
|
|
3123
|
+
* // [2200, 'Bob'],
|
|
3124
|
+
* // [1800, 'Charlie']
|
|
3125
|
+
* // ];
|
|
3126
|
+
*
|
|
3127
|
+
* // Highest scorer
|
|
3128
|
+
* console.log(leaderboard.first()); // [2500, 'Diana'];
|
|
3129
|
+
*
|
|
3130
|
+
* // Remove lowest scorer
|
|
3131
|
+
* console.log(leaderboard.pollLast()); // [1500, 'Alice'];
|
|
3132
|
+
* console.log(leaderboard.size); // 3;
|
|
3133
|
+
*/
|
|
3134
|
+
first(): [K, V | undefined] | undefined {
|
|
3135
|
+
const k = this.#core.getLeftMost();
|
|
3136
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3137
|
+
}
|
|
3138
|
+
|
|
3139
|
+
/**
|
|
3140
|
+
* Largest entry by key.
|
|
3141
|
+
|
|
3142
|
+
|
|
3143
|
+
|
|
3144
|
+
|
|
3145
|
+
|
|
3146
|
+
|
|
3147
|
+
|
|
3148
|
+
|
|
3149
|
+
|
|
3150
|
+
|
|
3151
|
+
|
|
3152
|
+
|
|
3153
|
+
|
|
3154
|
+
|
|
3155
|
+
|
|
3156
|
+
|
|
3157
|
+
|
|
3158
|
+
|
|
3159
|
+
|
|
3160
|
+
|
|
3161
|
+
|
|
3162
|
+
|
|
3163
|
+
|
|
3164
|
+
|
|
3165
|
+
|
|
3166
|
+
|
|
3167
|
+
|
|
3168
|
+
|
|
3169
|
+
|
|
3170
|
+
|
|
3171
|
+
|
|
3172
|
+
|
|
3173
|
+
* @example
|
|
3174
|
+
* // Access the maximum entry
|
|
3175
|
+
* const scores = new TreeMap<number, string>([
|
|
3176
|
+
* [85, 'Bob'],
|
|
3177
|
+
* [92, 'Alice'],
|
|
3178
|
+
* [78, 'Charlie']
|
|
3179
|
+
* ]);
|
|
3180
|
+
*
|
|
3181
|
+
* console.log(scores.last()); // [92, 'Alice'];
|
|
3182
|
+
* console.log(scores.first()); // [78, 'Charlie'];
|
|
3183
|
+
*/
|
|
3184
|
+
last(): [K, V | undefined] | undefined {
|
|
3185
|
+
const k = this.#core.getRightMost();
|
|
3186
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3187
|
+
}
|
|
3188
|
+
|
|
3189
|
+
/**
|
|
3190
|
+
* Remove and return the smallest entry.
|
|
3191
|
+
|
|
3192
|
+
|
|
3193
|
+
|
|
3194
|
+
|
|
3195
|
+
|
|
3196
|
+
|
|
3197
|
+
|
|
3198
|
+
|
|
3199
|
+
|
|
3200
|
+
|
|
3201
|
+
|
|
3202
|
+
|
|
3203
|
+
|
|
3204
|
+
|
|
3205
|
+
|
|
3206
|
+
|
|
3207
|
+
|
|
3208
|
+
|
|
3209
|
+
|
|
3210
|
+
|
|
3211
|
+
|
|
3212
|
+
|
|
3213
|
+
|
|
3214
|
+
|
|
3215
|
+
|
|
3216
|
+
|
|
3217
|
+
|
|
3218
|
+
|
|
3219
|
+
|
|
3220
|
+
|
|
3221
|
+
|
|
3222
|
+
|
|
3223
|
+
* @example
|
|
3224
|
+
* // Process items from lowest priority
|
|
3225
|
+
* const tasks = new TreeMap<number, string>([
|
|
3226
|
+
* [3, 'Low'],
|
|
3227
|
+
* [1, 'Critical'],
|
|
3228
|
+
* [2, 'Medium']
|
|
3229
|
+
* ]);
|
|
3230
|
+
*
|
|
3231
|
+
* // Process lowest priority first
|
|
3232
|
+
* console.log(tasks.pollFirst()); // [1, 'Critical'];
|
|
3233
|
+
* console.log(tasks.pollFirst()); // [2, 'Medium'];
|
|
3234
|
+
* console.log(tasks.size); // 1;
|
|
3235
|
+
*/
|
|
3236
|
+
pollFirst(): [K, V | undefined] | undefined {
|
|
3237
|
+
const entry = this.first();
|
|
3238
|
+
if (!entry) return undefined;
|
|
3239
|
+
this.delete(entry[0]);
|
|
3240
|
+
return entry;
|
|
3241
|
+
}
|
|
3242
|
+
|
|
3243
|
+
/**
|
|
3244
|
+
* Remove and return the largest entry.
|
|
3245
|
+
|
|
3246
|
+
|
|
3247
|
+
|
|
3248
|
+
|
|
3249
|
+
|
|
3250
|
+
|
|
3251
|
+
|
|
3252
|
+
|
|
3253
|
+
|
|
3254
|
+
|
|
3255
|
+
|
|
3256
|
+
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
|
|
3260
|
+
|
|
3261
|
+
|
|
3262
|
+
|
|
3263
|
+
|
|
3264
|
+
|
|
3265
|
+
|
|
3266
|
+
|
|
3267
|
+
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
|
|
3271
|
+
|
|
3272
|
+
|
|
3273
|
+
|
|
3274
|
+
|
|
3275
|
+
|
|
3276
|
+
|
|
3277
|
+
* @example
|
|
3278
|
+
* // Remove the maximum entry
|
|
3279
|
+
* const bids = new TreeMap<number, string>([
|
|
3280
|
+
* [100, 'Alice'],
|
|
3281
|
+
* [150, 'Bob'],
|
|
3282
|
+
* [120, 'Charlie']
|
|
3283
|
+
* ]);
|
|
3284
|
+
*
|
|
3285
|
+
* // Remove highest bid
|
|
3286
|
+
* console.log(bids.pollLast()); // [150, 'Bob'];
|
|
3287
|
+
* console.log(bids.size); // 2;
|
|
3288
|
+
* console.log(bids.last()); // [120, 'Charlie'];
|
|
3289
|
+
*/
|
|
3290
|
+
pollLast(): [K, V | undefined] | undefined {
|
|
3291
|
+
const entry = this.last();
|
|
3292
|
+
if (!entry) return undefined;
|
|
3293
|
+
this.delete(entry[0]);
|
|
3294
|
+
return entry;
|
|
3295
|
+
}
|
|
3296
|
+
|
|
3297
|
+
/**
|
|
3298
|
+
* Smallest entry whose key is >= the given key.
|
|
3299
|
+
|
|
3300
|
+
|
|
3301
|
+
|
|
3302
|
+
|
|
3303
|
+
|
|
3304
|
+
|
|
3305
|
+
|
|
3306
|
+
|
|
3307
|
+
|
|
3308
|
+
|
|
3309
|
+
|
|
3310
|
+
|
|
3311
|
+
|
|
3312
|
+
|
|
3313
|
+
|
|
3314
|
+
|
|
3315
|
+
|
|
3316
|
+
|
|
3317
|
+
|
|
3318
|
+
|
|
3319
|
+
|
|
3320
|
+
|
|
3321
|
+
|
|
3322
|
+
|
|
3323
|
+
|
|
3324
|
+
|
|
3325
|
+
|
|
3326
|
+
|
|
3327
|
+
|
|
3328
|
+
|
|
3329
|
+
|
|
3330
|
+
|
|
3331
|
+
|
|
3332
|
+
|
|
3333
|
+
|
|
3334
|
+
|
|
3335
|
+
|
|
3336
|
+
|
|
3337
|
+
|
|
3338
|
+
|
|
3339
|
+
|
|
3340
|
+
|
|
3341
|
+
|
|
3342
|
+
|
|
3343
|
+
|
|
3344
|
+
|
|
3345
|
+
|
|
3346
|
+
|
|
3347
|
+
|
|
3348
|
+
|
|
3349
|
+
|
|
3350
|
+
|
|
3351
|
+
|
|
3352
|
+
|
|
3353
|
+
|
|
3354
|
+
|
|
3355
|
+
|
|
3356
|
+
|
|
3357
|
+
|
|
3358
|
+
|
|
3359
|
+
|
|
3360
|
+
|
|
3361
|
+
|
|
3362
|
+
|
|
3363
|
+
|
|
3364
|
+
|
|
3365
|
+
|
|
3366
|
+
|
|
3367
|
+
|
|
3368
|
+
|
|
3369
|
+
|
|
3370
|
+
|
|
3371
|
+
|
|
3372
|
+
|
|
3373
|
+
|
|
3374
|
+
|
|
3375
|
+
|
|
3376
|
+
|
|
3377
|
+
|
|
3378
|
+
|
|
3379
|
+
|
|
3380
|
+
|
|
3381
|
+
|
|
3382
|
+
|
|
3383
|
+
|
|
3384
|
+
|
|
3385
|
+
|
|
3386
|
+
|
|
3387
|
+
|
|
3388
|
+
|
|
3389
|
+
|
|
3390
|
+
|
|
3391
|
+
|
|
3392
|
+
|
|
3393
|
+
|
|
3394
|
+
|
|
3395
|
+
|
|
3396
|
+
|
|
3397
|
+
|
|
3398
|
+
|
|
3399
|
+
|
|
3400
|
+
|
|
3401
|
+
|
|
3402
|
+
|
|
3403
|
+
|
|
3404
|
+
|
|
3405
|
+
|
|
3406
|
+
|
|
3407
|
+
|
|
3408
|
+
|
|
3409
|
+
|
|
3410
|
+
|
|
3411
|
+
|
|
3412
|
+
|
|
3413
|
+
|
|
3414
|
+
|
|
3415
|
+
|
|
3416
|
+
|
|
3417
|
+
|
|
3418
|
+
|
|
3419
|
+
|
|
3420
|
+
|
|
3421
|
+
* @example
|
|
3422
|
+
* // Event scheduler with time-based lookup
|
|
3423
|
+
* const events = new TreeMap<Date, string>();
|
|
3424
|
+
*
|
|
3425
|
+
* const meeting = new Date('2024-01-15T10:00:00Z');
|
|
1368
3426
|
* const lunch = new Date('2024-01-15T12:00:00Z');
|
|
1369
3427
|
* const review = new Date('2024-01-15T15:00:00Z');
|
|
1370
3428
|
* const standup = new Date('2024-01-15T09:00:00Z');
|
|
@@ -1382,24 +3440,324 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1382
3440
|
* // 'Code Review'
|
|
1383
3441
|
* // ];
|
|
1384
3442
|
*
|
|
1385
|
-
* // Next event after 11:00
|
|
1386
|
-
* const after11 = new Date('2024-01-15T11:00:00Z');
|
|
1387
|
-
* console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
|
|
3443
|
+
* // Next event after 11:00
|
|
3444
|
+
* const after11 = new Date('2024-01-15T11:00:00Z');
|
|
3445
|
+
* console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
|
|
3446
|
+
*
|
|
3447
|
+
* // Events between 9:30 and 13:00
|
|
3448
|
+
* const from = new Date('2024-01-15T09:30:00Z');
|
|
3449
|
+
* const to = new Date('2024-01-15T13:00:00Z');
|
|
3450
|
+
* const window = events.rangeSearch([from, to]);
|
|
3451
|
+
* console.log(window.map(([, v]) => v)); // ['Team Meeting', 'Lunch Break'];
|
|
3452
|
+
*/
|
|
3453
|
+
ceiling(key: K): [K, V | undefined] | undefined {
|
|
3454
|
+
this._validateKey(key);
|
|
3455
|
+
const k = this.#core.ceiling(key);
|
|
3456
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3457
|
+
}
|
|
3458
|
+
|
|
3459
|
+
/**
|
|
3460
|
+
* Largest entry whose key is <= the given key.
|
|
3461
|
+
|
|
3462
|
+
|
|
3463
|
+
|
|
3464
|
+
|
|
3465
|
+
|
|
3466
|
+
|
|
3467
|
+
|
|
3468
|
+
|
|
3469
|
+
|
|
3470
|
+
|
|
3471
|
+
|
|
3472
|
+
|
|
3473
|
+
|
|
3474
|
+
|
|
3475
|
+
|
|
3476
|
+
|
|
3477
|
+
|
|
3478
|
+
|
|
3479
|
+
|
|
3480
|
+
|
|
3481
|
+
|
|
3482
|
+
|
|
3483
|
+
|
|
3484
|
+
|
|
3485
|
+
|
|
3486
|
+
|
|
3487
|
+
|
|
3488
|
+
|
|
3489
|
+
|
|
3490
|
+
|
|
3491
|
+
|
|
3492
|
+
|
|
3493
|
+
|
|
3494
|
+
|
|
3495
|
+
|
|
3496
|
+
|
|
3497
|
+
|
|
3498
|
+
|
|
3499
|
+
|
|
3500
|
+
|
|
3501
|
+
|
|
3502
|
+
|
|
3503
|
+
|
|
3504
|
+
|
|
3505
|
+
|
|
3506
|
+
|
|
3507
|
+
|
|
3508
|
+
|
|
3509
|
+
|
|
3510
|
+
|
|
3511
|
+
|
|
3512
|
+
|
|
3513
|
+
|
|
3514
|
+
|
|
3515
|
+
|
|
3516
|
+
|
|
3517
|
+
|
|
3518
|
+
|
|
3519
|
+
|
|
3520
|
+
|
|
3521
|
+
|
|
3522
|
+
|
|
3523
|
+
|
|
3524
|
+
|
|
3525
|
+
|
|
3526
|
+
|
|
3527
|
+
|
|
3528
|
+
|
|
3529
|
+
|
|
3530
|
+
|
|
3531
|
+
|
|
3532
|
+
|
|
3533
|
+
|
|
3534
|
+
|
|
3535
|
+
|
|
3536
|
+
|
|
3537
|
+
|
|
3538
|
+
|
|
3539
|
+
|
|
3540
|
+
|
|
3541
|
+
|
|
3542
|
+
|
|
3543
|
+
|
|
3544
|
+
|
|
3545
|
+
|
|
3546
|
+
|
|
3547
|
+
|
|
3548
|
+
|
|
3549
|
+
|
|
3550
|
+
|
|
3551
|
+
|
|
3552
|
+
|
|
3553
|
+
|
|
3554
|
+
|
|
3555
|
+
|
|
3556
|
+
|
|
3557
|
+
|
|
3558
|
+
|
|
3559
|
+
|
|
3560
|
+
|
|
3561
|
+
|
|
3562
|
+
|
|
3563
|
+
|
|
3564
|
+
|
|
3565
|
+
|
|
3566
|
+
|
|
3567
|
+
|
|
3568
|
+
|
|
3569
|
+
|
|
3570
|
+
|
|
3571
|
+
|
|
3572
|
+
|
|
3573
|
+
|
|
3574
|
+
|
|
3575
|
+
|
|
3576
|
+
|
|
3577
|
+
|
|
3578
|
+
|
|
3579
|
+
|
|
3580
|
+
|
|
3581
|
+
|
|
3582
|
+
|
|
3583
|
+
* @example
|
|
3584
|
+
* // Find the largest key ≤ target
|
|
3585
|
+
* const versions = new TreeMap<number, string>([
|
|
3586
|
+
* [1, 'v1.0'],
|
|
3587
|
+
* [3, 'v3.0'],
|
|
3588
|
+
* [5, 'v5.0'],
|
|
3589
|
+
* [7, 'v7.0']
|
|
3590
|
+
* ]);
|
|
3591
|
+
*
|
|
3592
|
+
* // Largest version ≤ 4
|
|
3593
|
+
* console.log(versions.floor(4)); // [3, 'v3.0'];
|
|
3594
|
+
* // Largest version ≤ 5 (exact match)
|
|
3595
|
+
* console.log(versions.floor(5)); // [5, 'v5.0'];
|
|
3596
|
+
* // No version ≤ 0
|
|
3597
|
+
* console.log(versions.floor(0)); // undefined;
|
|
3598
|
+
*/
|
|
3599
|
+
floor(key: K): [K, V | undefined] | undefined {
|
|
3600
|
+
this._validateKey(key);
|
|
3601
|
+
const k = this.#core.floor(key);
|
|
3602
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3603
|
+
}
|
|
3604
|
+
|
|
3605
|
+
/**
|
|
3606
|
+
* Smallest entry whose key is > the given key.
|
|
3607
|
+
|
|
3608
|
+
|
|
3609
|
+
|
|
3610
|
+
|
|
3611
|
+
|
|
3612
|
+
|
|
3613
|
+
|
|
3614
|
+
|
|
3615
|
+
|
|
3616
|
+
|
|
3617
|
+
|
|
3618
|
+
|
|
3619
|
+
|
|
3620
|
+
|
|
3621
|
+
|
|
3622
|
+
|
|
3623
|
+
|
|
3624
|
+
|
|
3625
|
+
|
|
3626
|
+
|
|
3627
|
+
|
|
3628
|
+
|
|
3629
|
+
|
|
3630
|
+
|
|
3631
|
+
|
|
3632
|
+
|
|
3633
|
+
|
|
3634
|
+
|
|
3635
|
+
|
|
3636
|
+
|
|
3637
|
+
|
|
3638
|
+
|
|
3639
|
+
|
|
3640
|
+
|
|
3641
|
+
|
|
3642
|
+
|
|
3643
|
+
|
|
3644
|
+
|
|
3645
|
+
|
|
3646
|
+
|
|
3647
|
+
|
|
3648
|
+
|
|
3649
|
+
|
|
3650
|
+
|
|
3651
|
+
|
|
3652
|
+
|
|
3653
|
+
|
|
3654
|
+
|
|
3655
|
+
|
|
3656
|
+
|
|
3657
|
+
|
|
3658
|
+
|
|
3659
|
+
|
|
3660
|
+
|
|
3661
|
+
|
|
3662
|
+
|
|
3663
|
+
|
|
3664
|
+
|
|
3665
|
+
|
|
3666
|
+
|
|
3667
|
+
|
|
3668
|
+
|
|
3669
|
+
|
|
3670
|
+
|
|
3671
|
+
|
|
3672
|
+
|
|
3673
|
+
|
|
3674
|
+
|
|
3675
|
+
|
|
3676
|
+
|
|
3677
|
+
|
|
3678
|
+
|
|
3679
|
+
|
|
3680
|
+
|
|
3681
|
+
|
|
3682
|
+
|
|
3683
|
+
|
|
3684
|
+
|
|
3685
|
+
|
|
3686
|
+
|
|
3687
|
+
|
|
3688
|
+
|
|
3689
|
+
|
|
3690
|
+
|
|
3691
|
+
|
|
3692
|
+
|
|
3693
|
+
|
|
3694
|
+
|
|
3695
|
+
|
|
3696
|
+
|
|
3697
|
+
|
|
3698
|
+
|
|
3699
|
+
|
|
3700
|
+
|
|
3701
|
+
|
|
3702
|
+
|
|
3703
|
+
|
|
3704
|
+
|
|
3705
|
+
|
|
3706
|
+
|
|
3707
|
+
|
|
3708
|
+
|
|
3709
|
+
|
|
3710
|
+
|
|
3711
|
+
|
|
3712
|
+
|
|
3713
|
+
|
|
3714
|
+
|
|
3715
|
+
|
|
3716
|
+
|
|
3717
|
+
|
|
3718
|
+
|
|
3719
|
+
|
|
3720
|
+
|
|
3721
|
+
|
|
3722
|
+
|
|
3723
|
+
|
|
3724
|
+
|
|
3725
|
+
|
|
3726
|
+
|
|
3727
|
+
|
|
3728
|
+
|
|
3729
|
+
* @example
|
|
3730
|
+
* // Find the smallest key strictly > target
|
|
3731
|
+
* const prices = new TreeMap<number, string>([
|
|
3732
|
+
* [10, 'Basic'],
|
|
3733
|
+
* [25, 'Standard'],
|
|
3734
|
+
* [50, 'Premium'],
|
|
3735
|
+
* [100, 'Enterprise']
|
|
3736
|
+
* ]);
|
|
1388
3737
|
*
|
|
1389
|
-
* //
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1392
|
-
*
|
|
1393
|
-
*
|
|
3738
|
+
* // Next tier above $25
|
|
3739
|
+
* console.log(prices.higher(25)); // [50, 'Premium'];
|
|
3740
|
+
* // Next tier above $99
|
|
3741
|
+
* console.log(prices.higher(99)); // [100, 'Enterprise'];
|
|
3742
|
+
* // Nothing above $100
|
|
3743
|
+
* console.log(prices.higher(100)); // undefined;
|
|
1394
3744
|
*/
|
|
1395
|
-
|
|
3745
|
+
higher(key: K): [K, V | undefined] | undefined {
|
|
1396
3746
|
this._validateKey(key);
|
|
1397
|
-
const k = this.#core.
|
|
3747
|
+
const k = this.#core.higher(key);
|
|
1398
3748
|
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1399
3749
|
}
|
|
1400
3750
|
|
|
1401
3751
|
/**
|
|
1402
|
-
* Largest entry whose key is
|
|
3752
|
+
* Largest entry whose key is < the given key.
|
|
3753
|
+
|
|
3754
|
+
|
|
3755
|
+
|
|
3756
|
+
|
|
3757
|
+
|
|
3758
|
+
|
|
3759
|
+
|
|
3760
|
+
|
|
1403
3761
|
|
|
1404
3762
|
|
|
1405
3763
|
|
|
@@ -1438,30 +3796,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1438
3796
|
|
|
1439
3797
|
|
|
1440
3798
|
|
|
1441
|
-
* @example
|
|
1442
|
-
* // Find the largest key ≤ target
|
|
1443
|
-
* const versions = new TreeMap<number, string>([
|
|
1444
|
-
* [1, 'v1.0'],
|
|
1445
|
-
* [3, 'v3.0'],
|
|
1446
|
-
* [5, 'v5.0'],
|
|
1447
|
-
* [7, 'v7.0']
|
|
1448
|
-
* ]);
|
|
1449
|
-
*
|
|
1450
|
-
* // Largest version ≤ 4
|
|
1451
|
-
* console.log(versions.floor(4)); // [3, 'v3.0'];
|
|
1452
|
-
* // Largest version ≤ 5 (exact match)
|
|
1453
|
-
* console.log(versions.floor(5)); // [5, 'v5.0'];
|
|
1454
|
-
* // No version ≤ 0
|
|
1455
|
-
* console.log(versions.floor(0)); // undefined;
|
|
1456
|
-
*/
|
|
1457
|
-
floor(key: K): [K, V | undefined] | undefined {
|
|
1458
|
-
this._validateKey(key);
|
|
1459
|
-
const k = this.#core.floor(key);
|
|
1460
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
|
-
/**
|
|
1464
|
-
* Smallest entry whose key is > the given key.
|
|
1465
3799
|
|
|
1466
3800
|
|
|
1467
3801
|
|
|
@@ -1500,30 +3834,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1500
3834
|
|
|
1501
3835
|
|
|
1502
3836
|
|
|
1503
|
-
* @example
|
|
1504
|
-
* // Find the smallest key strictly > target
|
|
1505
|
-
* const prices = new TreeMap<number, string>([
|
|
1506
|
-
* [10, 'Basic'],
|
|
1507
|
-
* [25, 'Standard'],
|
|
1508
|
-
* [50, 'Premium'],
|
|
1509
|
-
* [100, 'Enterprise']
|
|
1510
|
-
* ]);
|
|
1511
|
-
*
|
|
1512
|
-
* // Next tier above $25
|
|
1513
|
-
* console.log(prices.higher(25)); // [50, 'Premium'];
|
|
1514
|
-
* // Next tier above $99
|
|
1515
|
-
* console.log(prices.higher(99)); // [100, 'Enterprise'];
|
|
1516
|
-
* // Nothing above $100
|
|
1517
|
-
* console.log(prices.higher(100)); // undefined;
|
|
1518
|
-
*/
|
|
1519
|
-
higher(key: K): [K, V | undefined] | undefined {
|
|
1520
|
-
this._validateKey(key);
|
|
1521
|
-
const k = this.#core.higher(key);
|
|
1522
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1523
|
-
}
|
|
1524
|
-
|
|
1525
|
-
/**
|
|
1526
|
-
* Largest entry whose key is < the given key.
|
|
1527
3837
|
|
|
1528
3838
|
|
|
1529
3839
|
|
|
@@ -1604,6 +3914,90 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1604
3914
|
|
|
1605
3915
|
|
|
1606
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
|
+
|
|
1607
4001
|
|
|
1608
4002
|
|
|
1609
4003
|
|
|
@@ -1697,6 +4091,111 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1697
4091
|
|
|
1698
4092
|
|
|
1699
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
|
+
|
|
1700
4199
|
|
|
1701
4200
|
|
|
1702
4201
|
|