data-structure-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/.vitepress/cache/deps_temp_51f5f1b0/chunk-7OIKW5WK.js +12984 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/package.json +3 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vue_devtools-api.js +4505 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vueuse_core.js +9731 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/vue.js +347 -0
- package/CHANGELOG.md +5 -1
- package/README.md +124 -29
- package/dist/cjs/binary-tree.cjs +26282 -0
- package/dist/cjs/graph.cjs +5422 -0
- package/dist/cjs/hash.cjs +1310 -0
- package/dist/cjs/heap.cjs +1602 -0
- package/dist/cjs/index.cjs +31257 -14673
- package/dist/cjs/linked-list.cjs +4576 -0
- package/dist/cjs/matrix.cjs +1080 -0
- package/dist/cjs/priority-queue.cjs +1376 -0
- package/dist/cjs/queue.cjs +4264 -0
- package/dist/cjs/stack.cjs +907 -0
- package/dist/cjs/trie.cjs +1223 -0
- package/dist/cjs-legacy/binary-tree.cjs +26319 -0
- package/dist/cjs-legacy/graph.cjs +5420 -0
- package/dist/cjs-legacy/hash.cjs +1310 -0
- package/dist/cjs-legacy/heap.cjs +1599 -0
- package/dist/cjs-legacy/index.cjs +31268 -14679
- package/dist/cjs-legacy/linked-list.cjs +4582 -0
- package/dist/cjs-legacy/matrix.cjs +1083 -0
- package/dist/cjs-legacy/priority-queue.cjs +1374 -0
- package/dist/cjs-legacy/queue.cjs +4262 -0
- package/dist/cjs-legacy/stack.cjs +907 -0
- package/dist/cjs-legacy/trie.cjs +1222 -0
- package/dist/esm/binary-tree.mjs +26267 -0
- package/dist/esm/graph.mjs +5409 -0
- package/dist/esm/hash.mjs +1307 -0
- package/dist/esm/heap.mjs +1596 -0
- package/dist/esm/index.mjs +31254 -14674
- package/dist/esm/linked-list.mjs +4569 -0
- package/dist/esm/matrix.mjs +1076 -0
- package/dist/esm/priority-queue.mjs +1372 -0
- package/dist/esm/queue.mjs +4260 -0
- package/dist/esm/stack.mjs +905 -0
- package/dist/esm/trie.mjs +1220 -0
- package/dist/esm-legacy/binary-tree.mjs +26304 -0
- package/dist/esm-legacy/graph.mjs +5407 -0
- package/dist/esm-legacy/hash.mjs +1307 -0
- package/dist/esm-legacy/heap.mjs +1593 -0
- package/dist/esm-legacy/index.mjs +31265 -14680
- package/dist/esm-legacy/linked-list.mjs +4575 -0
- package/dist/esm-legacy/matrix.mjs +1079 -0
- package/dist/esm-legacy/priority-queue.mjs +1370 -0
- package/dist/esm-legacy/queue.mjs +4258 -0
- package/dist/esm-legacy/stack.mjs +905 -0
- package/dist/esm-legacy/trie.mjs +1219 -0
- 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/data-structure-typed.js +31196 -14608
- package/dist/umd/data-structure-typed.min.js +11 -5
- package/docs-site-docusaurus/README.md +41 -0
- package/docs-site-docusaurus/docs/api/README.md +52 -0
- package/docs-site-docusaurus/docs/api/classes/AVLTree.md +6644 -0
- package/docs-site-docusaurus/docs/api/classes/AVLTreeNode.md +282 -0
- package/docs-site-docusaurus/docs/api/classes/AbstractGraph.md +2266 -0
- package/docs-site-docusaurus/docs/api/classes/BST.md +6293 -0
- package/docs-site-docusaurus/docs/api/classes/BSTNode.md +333 -0
- package/docs-site-docusaurus/docs/api/classes/BinaryIndexedTree.md +455 -0
- package/docs-site-docusaurus/docs/api/classes/BinaryTree.md +4647 -0
- package/docs-site-docusaurus/docs/api/classes/BinaryTreeNode.md +331 -0
- package/docs-site-docusaurus/docs/api/classes/Deque.md +2767 -0
- package/docs-site-docusaurus/docs/api/classes/DirectedGraph.md +2999 -0
- package/docs-site-docusaurus/docs/api/classes/DoublyLinkedList.md +2685 -0
- package/docs-site-docusaurus/docs/api/classes/DoublyLinkedListNode.md +221 -0
- package/docs-site-docusaurus/docs/api/classes/FibonacciHeap.md +253 -0
- package/docs-site-docusaurus/docs/api/classes/FibonacciHeapNode.md +21 -0
- package/docs-site-docusaurus/docs/api/classes/HashMap.md +1333 -0
- package/docs-site-docusaurus/docs/api/classes/Heap.md +1881 -0
- package/docs-site-docusaurus/docs/api/classes/IterableElementBase.md +800 -0
- package/docs-site-docusaurus/docs/api/classes/IterableEntryBase.md +644 -0
- package/docs-site-docusaurus/docs/api/classes/LinearBase.md +1632 -0
- package/docs-site-docusaurus/docs/api/classes/LinearLinkedBase.md +1853 -0
- package/docs-site-docusaurus/docs/api/classes/LinkedHashMap.md +1108 -0
- package/docs-site-docusaurus/docs/api/classes/LinkedListNode.md +156 -0
- package/docs-site-docusaurus/docs/api/classes/LinkedListQueue.md +2824 -0
- package/docs-site-docusaurus/docs/api/classes/MapGraph.md +2929 -0
- package/docs-site-docusaurus/docs/api/classes/Matrix.md +1026 -0
- package/docs-site-docusaurus/docs/api/classes/MaxHeap.md +1866 -0
- package/docs-site-docusaurus/docs/api/classes/MaxPriorityQueue.md +1883 -0
- package/docs-site-docusaurus/docs/api/classes/MinHeap.md +1879 -0
- package/docs-site-docusaurus/docs/api/classes/MinPriorityQueue.md +1882 -0
- package/docs-site-docusaurus/docs/api/classes/Navigator.md +109 -0
- package/docs-site-docusaurus/docs/api/classes/PriorityQueue.md +1839 -0
- package/docs-site-docusaurus/docs/api/classes/Queue.md +2244 -0
- package/docs-site-docusaurus/docs/api/classes/RedBlackTree.md +6888 -0
- package/docs-site-docusaurus/docs/api/classes/SegmentTree.md +372 -0
- package/docs-site-docusaurus/docs/api/classes/SinglyLinkedList.md +2897 -0
- package/docs-site-docusaurus/docs/api/classes/SinglyLinkedListNode.md +169 -0
- package/docs-site-docusaurus/docs/api/classes/SkipList.md +1229 -0
- package/docs-site-docusaurus/docs/api/classes/Stack.md +1573 -0
- package/docs-site-docusaurus/docs/api/classes/TreeMap.md +1389 -0
- package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +1591 -0
- package/docs-site-docusaurus/docs/api/classes/TreeSet.md +1246 -0
- package/docs-site-docusaurus/docs/api/classes/Trie.md +1708 -0
- package/docs-site-docusaurus/docs/api/classes/TrieNode.md +199 -0
- package/docs-site-docusaurus/docs/api/classes/UndirectedGraph.md +2979 -0
- package/docs-site-docusaurus/docs/guide/_category_.json +6 -0
- package/docs-site-docusaurus/docs/guide/architecture.md +615 -0
- package/docs-site-docusaurus/docs/guide/concepts.md +451 -0
- package/docs-site-docusaurus/docs/guide/faq.md +180 -0
- package/docs-site-docusaurus/docs/guide/guides.md +597 -0
- package/docs-site-docusaurus/docs/guide/installation.md +62 -0
- package/docs-site-docusaurus/docs/guide/integrations.md +825 -0
- package/docs-site-docusaurus/docs/guide/overview.md +645 -0
- package/docs-site-docusaurus/docs/guide/performance.md +835 -0
- package/docs-site-docusaurus/docs/guide/quick-start.md +104 -0
- package/docs-site-docusaurus/docs/guide/use-cases/_category_.json +6 -0
- package/docs-site-docusaurus/docs/guide/use-cases/array-sort-alternative.md +158 -0
- package/docs-site-docusaurus/docs/guide/use-cases/heap-vs-sorting.md +92 -0
- package/docs-site-docusaurus/docs/guide/use-cases/map-vs-treemap.md +151 -0
- package/docs-site-docusaurus/docs/guide/use-cases/priority-queue-typescript.md +113 -0
- package/docs-site-docusaurus/docs/guide/use-cases/treemap-javascript.md +151 -0
- package/docs-site-docusaurus/docusaurus.config.ts +159 -0
- package/docs-site-docusaurus/fix-mdx-generics.mjs +75 -0
- package/docs-site-docusaurus/package-lock.json +18667 -0
- package/docs-site-docusaurus/package.json +50 -0
- package/docs-site-docusaurus/prefix-class-to-methods.mjs +48 -0
- package/docs-site-docusaurus/sidebars.ts +23 -0
- package/docs-site-docusaurus/sort-protected.mjs +87 -0
- package/docs-site-docusaurus/src/css/custom.css +96 -0
- package/docs-site-docusaurus/src/pages/index.module.css +13 -0
- package/docs-site-docusaurus/src/pages/index.tsx +120 -0
- package/docs-site-docusaurus/src/pages/markdown-page.md +7 -0
- package/docs-site-docusaurus/src/theme/TOCItems/index.tsx +34 -0
- package/docs-site-docusaurus/static/.nojekyll +0 -0
- package/docs-site-docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docs-site-docusaurus/static/img/docusaurus.png +0 -0
- package/docs-site-docusaurus/static/img/favicon.ico +0 -0
- package/docs-site-docusaurus/static/img/favicon.png +0 -0
- package/docs-site-docusaurus/static/img/logo-180.png +0 -0
- package/docs-site-docusaurus/static/img/logo.jpg +0 -0
- package/docs-site-docusaurus/static/img/logo.png +0 -0
- package/docs-site-docusaurus/static/img/logo.svg +1 -0
- package/docs-site-docusaurus/static/img/og-image.png +0 -0
- package/docs-site-docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
- package/docs-site-docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
- package/docs-site-docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
- package/docs-site-docusaurus/static/llms.txt +37 -0
- package/docs-site-docusaurus/static/robots.txt +4 -0
- package/docs-site-docusaurus/typedoc.json +23 -0
- package/llms.txt +37 -0
- package/package.json +159 -55
- 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 +287 -0
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +327 -5
- package/src/data-structures/binary-tree/binary-tree.ts +581 -6
- package/src/data-structures/binary-tree/bst.ts +922 -7
- package/src/data-structures/binary-tree/red-black-tree.ts +453 -0
- package/src/data-structures/binary-tree/segment-tree.ts +139 -2
- package/src/data-structures/binary-tree/tree-map.ts +3300 -495
- package/src/data-structures/binary-tree/tree-multi-map.ts +3384 -563
- package/src/data-structures/binary-tree/tree-multi-set.ts +2757 -493
- package/src/data-structures/binary-tree/tree-set.ts +3122 -440
- package/src/data-structures/graph/abstract-graph.ts +6 -6
- package/src/data-structures/graph/directed-graph.ts +230 -0
- package/src/data-structures/graph/undirected-graph.ts +207 -0
- package/src/data-structures/hash/hash-map.ts +270 -19
- package/src/data-structures/heap/heap.ts +326 -4
- package/src/data-structures/heap/max-heap.ts +2 -2
- package/src/data-structures/linked-list/doubly-linked-list.ts +394 -3
- package/src/data-structures/linked-list/singly-linked-list.ts +348 -3
- package/src/data-structures/linked-list/skip-linked-list.ts +421 -7
- package/src/data-structures/matrix/matrix.ts +194 -10
- package/src/data-structures/priority-queue/max-priority-queue.ts +2 -2
- package/src/data-structures/queue/deque.ts +350 -5
- package/src/data-structures/queue/queue.ts +276 -0
- package/src/data-structures/stack/stack.ts +230 -0
- package/src/data-structures/trie/trie.ts +283 -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
- package/vercel.json +6 -0
- package/dist/leetcode/avl-tree-counter.mjs +0 -2957
- package/dist/leetcode/avl-tree-multi-map.mjs +0 -2889
- package/dist/leetcode/avl-tree.mjs +0 -2720
- package/dist/leetcode/binary-tree.mjs +0 -1594
- package/dist/leetcode/bst.mjs +0 -2398
- package/dist/leetcode/deque.mjs +0 -683
- package/dist/leetcode/directed-graph.mjs +0 -1733
- package/dist/leetcode/doubly-linked-list.mjs +0 -709
- package/dist/leetcode/hash-map.mjs +0 -493
- package/dist/leetcode/heap.mjs +0 -542
- package/dist/leetcode/max-heap.mjs +0 -375
- package/dist/leetcode/max-priority-queue.mjs +0 -383
- package/dist/leetcode/min-heap.mjs +0 -363
- package/dist/leetcode/min-priority-queue.mjs +0 -371
- package/dist/leetcode/priority-queue.mjs +0 -363
- package/dist/leetcode/queue.mjs +0 -943
- package/dist/leetcode/red-black-tree.mjs +0 -2765
- package/dist/leetcode/singly-linked-list.mjs +0 -754
- package/dist/leetcode/stack.mjs +0 -217
- package/dist/leetcode/tree-counter.mjs +0 -3039
- package/dist/leetcode/tree-multi-map.mjs +0 -2913
- package/dist/leetcode/trie.mjs +0 -413
- package/dist/leetcode/undirected-graph.mjs +0 -1650
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
import type { Comparator } from '../../types';
|
|
11
11
|
import type { TreeMapEntryCallback, TreeMapOptions, TreeMapRangeOptions, TreeMapReduceCallback } from '../../types';
|
|
12
12
|
import { RedBlackTree } from './red-black-tree';
|
|
13
|
-
import { ERR } from '../../common';
|
|
13
|
+
import { ERR, raise } from '../../common';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* An ordered Map backed by a red-black tree.
|
|
@@ -52,7 +52,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
52
52
|
const comparator = options.comparator ?? TreeMap.createDefaultComparator<K>();
|
|
53
53
|
this.#isDefaultComparator = options.comparator === undefined;
|
|
54
54
|
|
|
55
|
-
this.#core = new RedBlackTree<K, V>([], { comparator, isMapMode: options.isMapMode });
|
|
55
|
+
this.#core = new RedBlackTree<K, V>([], { comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
|
|
56
56
|
|
|
57
57
|
for (const item of entries) {
|
|
58
58
|
let k: K;
|
|
@@ -64,7 +64,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
64
64
|
} else {
|
|
65
65
|
// Validate entries like native Map: each item must be a 2-tuple-like value.
|
|
66
66
|
if (!Array.isArray(item) || item.length < 2) {
|
|
67
|
-
|
|
67
|
+
raise(TypeError, ERR.invalidEntry('TreeMap'));
|
|
68
68
|
}
|
|
69
69
|
k = item[0] as K;
|
|
70
70
|
v = item[1] as V | undefined;
|
|
@@ -88,7 +88,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
88
88
|
return (a: K, b: K): number => {
|
|
89
89
|
if (typeof a === 'number' && typeof b === 'number') {
|
|
90
90
|
/* istanbul ignore next -- _validateKey prevents NaN from entering the tree */
|
|
91
|
-
if (Number.isNaN(a) || Number.isNaN(b))
|
|
91
|
+
if (Number.isNaN(a) || Number.isNaN(b)) raise(TypeError, ERR.invalidNaN('TreeMap'));
|
|
92
92
|
const aa = Object.is(a, -0) ? 0 : a;
|
|
93
93
|
const bb = Object.is(b, -0) ? 0 : b;
|
|
94
94
|
return aa > bb ? 1 : aa < bb ? -1 : 0;
|
|
@@ -102,11 +102,11 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
102
102
|
const ta = a.getTime();
|
|
103
103
|
const tb = b.getTime();
|
|
104
104
|
/* istanbul ignore next -- _validateKey prevents invalid Date from entering the tree */
|
|
105
|
-
if (Number.isNaN(ta) || Number.isNaN(tb))
|
|
105
|
+
if (Number.isNaN(ta) || Number.isNaN(tb)) raise(TypeError, ERR.invalidDate('TreeMap'));
|
|
106
106
|
return ta > tb ? 1 : ta < tb ? -1 : 0;
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
raise(TypeError, ERR.comparatorRequired('TreeMap'));
|
|
110
110
|
};
|
|
111
111
|
}
|
|
112
112
|
|
|
@@ -114,18 +114,18 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
114
114
|
if (!this.#isDefaultComparator) return;
|
|
115
115
|
|
|
116
116
|
if (typeof key === 'number') {
|
|
117
|
-
if (Number.isNaN(key))
|
|
117
|
+
if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeMap'));
|
|
118
118
|
return;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
if (typeof key === 'string') return;
|
|
122
122
|
|
|
123
123
|
if (key instanceof Date) {
|
|
124
|
-
if (Number.isNaN(key.getTime()))
|
|
124
|
+
if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeMap'));
|
|
125
125
|
return;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
raise(TypeError, ERR.comparatorRequired('TreeMap'));
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
/**
|
|
@@ -180,17 +180,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
180
180
|
|
|
181
181
|
|
|
182
182
|
|
|
183
|
-
* @example
|
|
184
|
-
* // Check empty
|
|
185
|
-
* console.log(new TreeMap().isEmpty()); // true;
|
|
186
|
-
*/
|
|
187
|
-
isEmpty(): boolean {
|
|
188
|
-
return this.size === 0;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Set or overwrite a value for a key.
|
|
193
|
-
* @remarks Expected time O(log n)
|
|
194
183
|
|
|
195
184
|
|
|
196
185
|
|
|
@@ -243,36 +232,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
243
232
|
|
|
244
233
|
|
|
245
234
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
* console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
|
|
256
|
-
* console.log(contacts.get('Bob')); // '555-0102';
|
|
257
|
-
*
|
|
258
|
-
* // Find the first contact alphabetically after 'B'
|
|
259
|
-
* console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
|
|
260
|
-
*
|
|
261
|
-
* // Find contacts in range
|
|
262
|
-
* console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
|
|
263
|
-
* // ['Alice', '555-0101'],
|
|
264
|
-
* // ['Bob', '555-0102']
|
|
265
|
-
* // ];
|
|
266
|
-
*/
|
|
267
|
-
set(key: K, value: V | undefined): this {
|
|
268
|
-
this._validateKey(key);
|
|
269
|
-
this.#core.set(key, value as V);
|
|
270
|
-
return this;
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
/**
|
|
274
|
-
* Get the value under a key.
|
|
275
|
-
* @remarks Expected time O(log n)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
|
|
276
244
|
|
|
277
245
|
|
|
278
246
|
|
|
@@ -328,24 +296,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
328
296
|
|
|
329
297
|
|
|
330
298
|
* @example
|
|
331
|
-
* //
|
|
332
|
-
*
|
|
333
|
-
* ['maxRetries', 3],
|
|
334
|
-
* ['timeout', 5000],
|
|
335
|
-
* ['poolSize', 10]
|
|
336
|
-
* ]);
|
|
337
|
-
*
|
|
338
|
-
* console.log(config.get('timeout')); // 5000;
|
|
339
|
-
* console.log(config.get('missing')); // undefined;
|
|
340
|
-
* console.log(config.size); // 3;
|
|
299
|
+
* // Check empty
|
|
300
|
+
* console.log(new TreeMap().isEmpty()); // true;
|
|
341
301
|
*/
|
|
342
|
-
|
|
343
|
-
this.
|
|
344
|
-
return this.#core.get(key);
|
|
302
|
+
isEmpty(): boolean {
|
|
303
|
+
return this.size === 0;
|
|
345
304
|
}
|
|
346
305
|
|
|
347
306
|
/**
|
|
348
|
-
*
|
|
307
|
+
* Set or overwrite a value for a key.
|
|
349
308
|
* @remarks Expected time O(log n)
|
|
350
309
|
|
|
351
310
|
|
|
@@ -401,26 +360,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
401
360
|
|
|
402
361
|
|
|
403
362
|
|
|
404
|
-
* @example
|
|
405
|
-
* // Feature flag checking
|
|
406
|
-
* const flags = new TreeMap<string, boolean>([
|
|
407
|
-
* ['darkMode', true],
|
|
408
|
-
* ['betaFeature', false],
|
|
409
|
-
* ['notifications', true]
|
|
410
|
-
* ]);
|
|
411
|
-
*
|
|
412
|
-
* console.log(flags.has('darkMode')); // true;
|
|
413
|
-
* console.log(flags.has('unknownFlag')); // false;
|
|
414
|
-
*/
|
|
415
|
-
has(key: K): boolean {
|
|
416
|
-
this._validateKey(key);
|
|
417
|
-
return this.#core.has(key);
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/**
|
|
421
|
-
* Delete a key.
|
|
422
|
-
* @returns `true` if the key existed; otherwise `false`.
|
|
423
|
-
* @remarks Expected time O(log n)
|
|
424
363
|
|
|
425
364
|
|
|
426
365
|
|
|
@@ -475,27 +414,22 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
475
414
|
|
|
476
415
|
|
|
477
416
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
/**
|
|
498
|
-
* Remove all entries.
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
|
|
499
433
|
|
|
500
434
|
|
|
501
435
|
|
|
@@ -540,20 +474,35 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
540
474
|
|
|
541
475
|
|
|
542
476
|
* @example
|
|
543
|
-
* //
|
|
544
|
-
* const
|
|
545
|
-
*
|
|
546
|
-
*
|
|
477
|
+
* // Sorted dictionary for a contact book
|
|
478
|
+
* const contacts = new TreeMap<string, string>([
|
|
479
|
+
* ['Bob', '555-0102'],
|
|
480
|
+
* ['Alice', '555-0101'],
|
|
481
|
+
* ['Charlie', '555-0103']
|
|
482
|
+
* ]);
|
|
483
|
+
*
|
|
484
|
+
* // Contacts are automatically sorted by name
|
|
485
|
+
* console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
|
|
486
|
+
* console.log(contacts.get('Bob')); // '555-0102';
|
|
487
|
+
*
|
|
488
|
+
* // Find the first contact alphabetically after 'B'
|
|
489
|
+
* console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
|
|
490
|
+
*
|
|
491
|
+
* // Find contacts in range
|
|
492
|
+
* console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
|
|
493
|
+
* // ['Alice', '555-0101'],
|
|
494
|
+
* // ['Bob', '555-0102']
|
|
495
|
+
* // ];
|
|
547
496
|
*/
|
|
548
|
-
|
|
549
|
-
this
|
|
497
|
+
set(key: K, value: V | undefined): this {
|
|
498
|
+
this._validateKey(key);
|
|
499
|
+
this.#core.set(key, value as V);
|
|
500
|
+
return this;
|
|
550
501
|
}
|
|
551
502
|
|
|
552
503
|
/**
|
|
553
|
-
*
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
504
|
+
* Get the value under a key.
|
|
505
|
+
* @remarks Expected time O(log n)
|
|
557
506
|
|
|
558
507
|
|
|
559
508
|
|
|
@@ -594,25 +543,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
594
543
|
|
|
595
544
|
|
|
596
545
|
|
|
597
|
-
* @example
|
|
598
|
-
* // Get sorted keys
|
|
599
|
-
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
|
|
600
|
-
* console.log([...tm.keys()]); // [1, 3];
|
|
601
|
-
*/
|
|
602
|
-
keys(): IterableIterator<K> {
|
|
603
|
-
return this.#core.keys();
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
private _entryFromKey(k: K): [K, V | undefined] {
|
|
607
|
-
// Keys come from `keys()` which only yields existing keys.
|
|
608
|
-
// We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
|
|
609
|
-
return [k, this.#core.get(k)];
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
/**
|
|
613
|
-
* Iterate over values in ascending key order.
|
|
614
|
-
*
|
|
615
|
-
* Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
|
|
616
546
|
|
|
617
547
|
|
|
618
548
|
|
|
@@ -656,19 +586,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
656
586
|
|
|
657
587
|
|
|
658
588
|
|
|
659
|
-
* @example
|
|
660
|
-
* // Get values in key order
|
|
661
|
-
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
662
|
-
* console.log([...tm.values()]); // ['a', 'b'];
|
|
663
|
-
*/
|
|
664
|
-
*values(): IterableIterator<V | undefined> {
|
|
665
|
-
for (const k of this.keys()) yield this._entryFromKey(k)[1];
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
/**
|
|
669
|
-
* Iterate over `[key, value]` entries in ascending key order.
|
|
670
|
-
*
|
|
671
|
-
* Note: values may be `undefined`.
|
|
672
589
|
|
|
673
590
|
|
|
674
591
|
|
|
@@ -712,23 +629,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
712
629
|
|
|
713
630
|
|
|
714
631
|
|
|
715
|
-
* @example
|
|
716
|
-
* // Iterate key-value pairs
|
|
717
|
-
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
|
|
718
|
-
* console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
|
|
719
|
-
*/
|
|
720
|
-
*entries(): IterableIterator<[K, V | undefined]> {
|
|
721
|
-
for (const k of this.keys()) yield this._entryFromKey(k);
|
|
722
|
-
}
|
|
723
|
-
|
|
724
|
-
[Symbol.iterator](): IterableIterator<[K, V | undefined]> {
|
|
725
|
-
return this.entries();
|
|
726
|
-
}
|
|
727
|
-
|
|
728
|
-
/**
|
|
729
|
-
* Visit each entry in ascending key order.
|
|
730
|
-
*
|
|
731
|
-
* Note: callback value may be `undefined`.
|
|
732
632
|
|
|
733
633
|
|
|
734
634
|
|
|
@@ -773,21 +673,25 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
773
673
|
|
|
774
674
|
|
|
775
675
|
* @example
|
|
776
|
-
* //
|
|
777
|
-
* const
|
|
778
|
-
*
|
|
779
|
-
*
|
|
780
|
-
*
|
|
676
|
+
* // Configuration registry with typed lookups
|
|
677
|
+
* const config = new TreeMap<string, number>([
|
|
678
|
+
* ['maxRetries', 3],
|
|
679
|
+
* ['timeout', 5000],
|
|
680
|
+
* ['poolSize', 10]
|
|
681
|
+
* ]);
|
|
682
|
+
*
|
|
683
|
+
* console.log(config.get('timeout')); // 5000;
|
|
684
|
+
* console.log(config.get('missing')); // undefined;
|
|
685
|
+
* console.log(config.size); // 3;
|
|
781
686
|
*/
|
|
782
|
-
|
|
783
|
-
|
|
687
|
+
get(key: K): V | undefined {
|
|
688
|
+
this._validateKey(key);
|
|
689
|
+
return this.#core.get(key);
|
|
784
690
|
}
|
|
785
691
|
|
|
786
692
|
/**
|
|
787
|
-
*
|
|
788
|
-
*
|
|
789
|
-
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
790
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
693
|
+
* Test whether a key exists.
|
|
694
|
+
* @remarks Expected time O(log n)
|
|
791
695
|
|
|
792
696
|
|
|
793
697
|
|
|
@@ -831,31 +735,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
831
735
|
|
|
832
736
|
|
|
833
737
|
|
|
834
|
-
* @example
|
|
835
|
-
* // Transform entries
|
|
836
|
-
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
837
|
-
* const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
|
|
838
|
-
* console.log([...doubled.values()]); // [20, 40];
|
|
839
|
-
*/
|
|
840
|
-
map<MK, MV>(
|
|
841
|
-
callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
|
|
842
|
-
options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
843
|
-
thisArg?: unknown
|
|
844
|
-
): TreeMap<MK, MV> {
|
|
845
|
-
const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
|
|
846
|
-
let index = 0;
|
|
847
|
-
for (const [k, v] of this) {
|
|
848
|
-
const [mk, mv] = thisArg === undefined
|
|
849
|
-
? callbackfn(v, k, index++, this)
|
|
850
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
|
|
851
|
-
out.set(mk, mv);
|
|
852
|
-
}
|
|
853
|
-
return out;
|
|
854
|
-
}
|
|
855
|
-
|
|
856
|
-
/**
|
|
857
|
-
* Create a new TreeMap containing only entries that satisfy the predicate.
|
|
858
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
859
738
|
|
|
860
739
|
|
|
861
740
|
|
|
@@ -899,28 +778,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
899
778
|
|
|
900
779
|
|
|
901
780
|
|
|
902
|
-
* @example
|
|
903
|
-
* // Filter entries
|
|
904
|
-
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
|
|
905
|
-
* const filtered = tm.filter((v, k) => k > 1);
|
|
906
|
-
* console.log([...filtered.keys()]); // [2, 3];
|
|
907
|
-
*/
|
|
908
|
-
filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
|
|
909
|
-
const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
|
|
910
|
-
let index = 0;
|
|
911
|
-
for (const [k, v] of this) {
|
|
912
|
-
const ok = thisArg === undefined
|
|
913
|
-
? callbackfn(v, k, index++, this)
|
|
914
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
915
|
-
if (ok) out.set(k, v);
|
|
916
|
-
}
|
|
917
|
-
return out;
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
/**
|
|
921
|
-
* Reduce entries into a single accumulator.
|
|
922
|
-
* @remarks Time O(n), Space O(1)
|
|
923
|
-
|
|
924
781
|
|
|
925
782
|
|
|
926
783
|
|
|
@@ -963,21 +820,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
963
820
|
|
|
964
821
|
|
|
965
822
|
|
|
966
|
-
* @example
|
|
967
|
-
* // Aggregate values
|
|
968
|
-
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
969
|
-
* console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
|
|
970
|
-
*/
|
|
971
|
-
reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
|
|
972
|
-
let acc = initialValue;
|
|
973
|
-
let index = 0;
|
|
974
|
-
for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
|
|
975
|
-
return acc;
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
/**
|
|
979
|
-
* Test whether all entries satisfy a predicate.
|
|
980
|
-
* @remarks Time O(n), Space O(1)
|
|
981
823
|
|
|
982
824
|
|
|
983
825
|
|
|
@@ -1020,24 +862,26 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1020
862
|
|
|
1021
863
|
|
|
1022
864
|
* @example
|
|
1023
|
-
* //
|
|
1024
|
-
* const
|
|
1025
|
-
*
|
|
865
|
+
* // Feature flag checking
|
|
866
|
+
* const flags = new TreeMap<string, boolean>([
|
|
867
|
+
* ['darkMode', true],
|
|
868
|
+
* ['betaFeature', false],
|
|
869
|
+
* ['notifications', true]
|
|
870
|
+
* ]);
|
|
871
|
+
*
|
|
872
|
+
* console.log(flags.has('darkMode')); // true;
|
|
873
|
+
* console.log(flags.has('unknownFlag')); // false;
|
|
1026
874
|
*/
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
const ok = thisArg === undefined
|
|
1031
|
-
? callbackfn(v, k, index++, this)
|
|
1032
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
1033
|
-
if (!ok) return false;
|
|
1034
|
-
}
|
|
1035
|
-
return true;
|
|
875
|
+
has(key: K): boolean {
|
|
876
|
+
this._validateKey(key);
|
|
877
|
+
return this.#core.has(key);
|
|
1036
878
|
}
|
|
1037
879
|
|
|
1038
880
|
/**
|
|
1039
|
-
*
|
|
1040
|
-
* @
|
|
881
|
+
* Delete a key.
|
|
882
|
+
* @returns `true` if the key existed; otherwise `false`.
|
|
883
|
+
* @remarks Expected time O(log n)
|
|
884
|
+
|
|
1041
885
|
|
|
1042
886
|
|
|
1043
887
|
|
|
@@ -1079,26 +923,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1079
923
|
|
|
1080
924
|
|
|
1081
925
|
|
|
1082
|
-
* @example
|
|
1083
|
-
* // Test any entry
|
|
1084
|
-
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
1085
|
-
* console.log(tm.some((v, k) => k === 2)); // true;
|
|
1086
|
-
*/
|
|
1087
|
-
some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
|
|
1088
|
-
let index = 0;
|
|
1089
|
-
for (const [k, v] of this) {
|
|
1090
|
-
const ok = thisArg === undefined
|
|
1091
|
-
? callbackfn(v, k, index++, this)
|
|
1092
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
1093
|
-
if (ok) return true;
|
|
1094
|
-
}
|
|
1095
|
-
return false;
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
/**
|
|
1099
|
-
* Find the first entry that satisfies a predicate.
|
|
1100
|
-
* @returns The first matching `[key, value]` tuple, or `undefined`.
|
|
1101
|
-
* @remarks Time O(n), Space O(1)
|
|
1102
926
|
|
|
1103
927
|
|
|
1104
928
|
|
|
@@ -1140,25 +964,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1140
964
|
|
|
1141
965
|
|
|
1142
966
|
|
|
1143
|
-
* @example
|
|
1144
|
-
* // Find matching entry
|
|
1145
|
-
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
1146
|
-
* console.log(tm.find(v => v === 'b')?.[0]); // 2;
|
|
1147
|
-
*/
|
|
1148
|
-
find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
|
|
1149
|
-
let index = 0;
|
|
1150
|
-
for (const [k, v] of this) {
|
|
1151
|
-
const ok = thisArg === undefined
|
|
1152
|
-
? callbackfn(v, k, index++, this)
|
|
1153
|
-
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
1154
|
-
if (ok) return [k, v];
|
|
1155
|
-
}
|
|
1156
|
-
return undefined;
|
|
1157
|
-
}
|
|
1158
|
-
|
|
1159
|
-
/**
|
|
1160
|
-
* Materialize the map into an array of `[key, value]` tuples.
|
|
1161
|
-
* @remarks Time O(n), Space O(n)
|
|
1162
967
|
|
|
1163
968
|
|
|
1164
969
|
|
|
@@ -1202,18 +1007,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1202
1007
|
|
|
1203
1008
|
|
|
1204
1009
|
|
|
1205
|
-
* @example
|
|
1206
|
-
* // Convert to array
|
|
1207
|
-
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
1208
|
-
* console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
|
|
1209
|
-
*/
|
|
1210
|
-
toArray(): Array<[K, V | undefined]> {
|
|
1211
|
-
return [...this];
|
|
1212
|
-
}
|
|
1213
|
-
|
|
1214
|
-
/**
|
|
1215
|
-
* Print a human-friendly representation.
|
|
1216
|
-
* @remarks Time O(n), Space O(n)
|
|
1217
1010
|
|
|
1218
1011
|
|
|
1219
1012
|
|
|
@@ -1258,20 +1051,26 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1258
1051
|
|
|
1259
1052
|
|
|
1260
1053
|
* @example
|
|
1261
|
-
* //
|
|
1262
|
-
* const
|
|
1263
|
-
*
|
|
1054
|
+
* // Session management with expiry
|
|
1055
|
+
* const sessions = new TreeMap<string, number>([
|
|
1056
|
+
* ['sess_abc', Date.now()],
|
|
1057
|
+
* ['sess_def', Date.now()],
|
|
1058
|
+
* ['sess_ghi', Date.now()]
|
|
1059
|
+
* ]);
|
|
1060
|
+
*
|
|
1061
|
+
* console.log(sessions.size); // 3;
|
|
1062
|
+
* sessions.delete('sess_def');
|
|
1063
|
+
* console.log(sessions.has('sess_def')); // false;
|
|
1064
|
+
* console.log(sessions.size); // 2;
|
|
1264
1065
|
*/
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
this.#core.
|
|
1066
|
+
delete(key: K): boolean {
|
|
1067
|
+
this._validateKey(key);
|
|
1068
|
+
const res = this.#core.delete(key);
|
|
1069
|
+
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
1268
1070
|
}
|
|
1269
1071
|
|
|
1270
|
-
// Navigable operations (return entry tuples)
|
|
1271
|
-
// Note: returned tuple values may be `undefined`.
|
|
1272
|
-
|
|
1273
1072
|
/**
|
|
1274
|
-
*
|
|
1073
|
+
* Remove all entries.
|
|
1275
1074
|
|
|
1276
1075
|
|
|
1277
1076
|
|
|
@@ -1284,40 +1083,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1284
1083
|
|
|
1285
1084
|
|
|
1286
1085
|
|
|
1287
|
-
* @example
|
|
1288
|
-
* // Leaderboard with ranked scores
|
|
1289
|
-
* // Use score as key (descending), player name as value
|
|
1290
|
-
* const leaderboard = new TreeMap<number, string>([], {
|
|
1291
|
-
* comparator: (a, b) => b - a // descending
|
|
1292
|
-
* });
|
|
1293
|
-
*
|
|
1294
|
-
* leaderboard.set(1500, 'Alice');
|
|
1295
|
-
* leaderboard.set(2200, 'Bob');
|
|
1296
|
-
* leaderboard.set(1800, 'Charlie');
|
|
1297
|
-
* leaderboard.set(2500, 'Diana');
|
|
1298
|
-
*
|
|
1299
|
-
* // Top 3 players (first 3 in descending order)
|
|
1300
|
-
* const top3 = [...leaderboard.entries()].slice(0, 3);
|
|
1301
|
-
* console.log(top3); // [
|
|
1302
|
-
* // [2500, 'Diana'],
|
|
1303
|
-
* // [2200, 'Bob'],
|
|
1304
|
-
* // [1800, 'Charlie']
|
|
1305
|
-
* // ];
|
|
1306
|
-
*
|
|
1307
|
-
* // Highest scorer
|
|
1308
|
-
* console.log(leaderboard.first()); // [2500, 'Diana'];
|
|
1309
|
-
*
|
|
1310
|
-
* // Remove lowest scorer
|
|
1311
|
-
* console.log(leaderboard.pollLast()); // [1500, 'Alice'];
|
|
1312
|
-
* console.log(leaderboard.size); // 3;
|
|
1313
|
-
*/
|
|
1314
|
-
first(): [K, V | undefined] | undefined {
|
|
1315
|
-
const k = this.#core.getLeftMost();
|
|
1316
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1317
|
-
}
|
|
1318
|
-
|
|
1319
|
-
/**
|
|
1320
|
-
* Largest entry by key.
|
|
1321
1086
|
|
|
1322
1087
|
|
|
1323
1088
|
|
|
@@ -1330,24 +1095,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1330
1095
|
|
|
1331
1096
|
|
|
1332
1097
|
|
|
1333
|
-
* @example
|
|
1334
|
-
* // Access the maximum entry
|
|
1335
|
-
* const scores = new TreeMap<number, string>([
|
|
1336
|
-
* [85, 'Bob'],
|
|
1337
|
-
* [92, 'Alice'],
|
|
1338
|
-
* [78, 'Charlie']
|
|
1339
|
-
* ]);
|
|
1340
|
-
*
|
|
1341
|
-
* console.log(scores.last()); // [92, 'Alice'];
|
|
1342
|
-
* console.log(scores.first()); // [78, 'Charlie'];
|
|
1343
|
-
*/
|
|
1344
|
-
last(): [K, V | undefined] | undefined {
|
|
1345
|
-
const k = this.#core.getRightMost();
|
|
1346
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1347
|
-
}
|
|
1348
|
-
|
|
1349
|
-
/**
|
|
1350
|
-
* Remove and return the smallest entry.
|
|
1351
1098
|
|
|
1352
1099
|
|
|
1353
1100
|
|
|
@@ -1360,28 +1107,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1360
1107
|
|
|
1361
1108
|
|
|
1362
1109
|
|
|
1363
|
-
* @example
|
|
1364
|
-
* // Process items from lowest priority
|
|
1365
|
-
* const tasks = new TreeMap<number, string>([
|
|
1366
|
-
* [3, 'Low'],
|
|
1367
|
-
* [1, 'Critical'],
|
|
1368
|
-
* [2, 'Medium']
|
|
1369
|
-
* ]);
|
|
1370
|
-
*
|
|
1371
|
-
* // Process lowest priority first
|
|
1372
|
-
* console.log(tasks.pollFirst()); // [1, 'Critical'];
|
|
1373
|
-
* console.log(tasks.pollFirst()); // [2, 'Medium'];
|
|
1374
|
-
* console.log(tasks.size); // 1;
|
|
1375
|
-
*/
|
|
1376
|
-
pollFirst(): [K, V | undefined] | undefined {
|
|
1377
|
-
const entry = this.first();
|
|
1378
|
-
if (!entry) return undefined;
|
|
1379
|
-
this.delete(entry[0]);
|
|
1380
|
-
return entry;
|
|
1381
|
-
}
|
|
1382
|
-
|
|
1383
|
-
/**
|
|
1384
|
-
* Remove and return the largest entry.
|
|
1385
1110
|
|
|
1386
1111
|
|
|
1387
1112
|
|
|
@@ -1394,28 +1119,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1394
1119
|
|
|
1395
1120
|
|
|
1396
1121
|
|
|
1397
|
-
* @example
|
|
1398
|
-
* // Remove the maximum entry
|
|
1399
|
-
* const bids = new TreeMap<number, string>([
|
|
1400
|
-
* [100, 'Alice'],
|
|
1401
|
-
* [150, 'Bob'],
|
|
1402
|
-
* [120, 'Charlie']
|
|
1403
|
-
* ]);
|
|
1404
|
-
*
|
|
1405
|
-
* // Remove highest bid
|
|
1406
|
-
* console.log(bids.pollLast()); // [150, 'Bob'];
|
|
1407
|
-
* console.log(bids.size); // 2;
|
|
1408
|
-
* console.log(bids.last()); // [120, 'Charlie'];
|
|
1409
|
-
*/
|
|
1410
|
-
pollLast(): [K, V | undefined] | undefined {
|
|
1411
|
-
const entry = this.last();
|
|
1412
|
-
if (!entry) return undefined;
|
|
1413
|
-
this.delete(entry[0]);
|
|
1414
|
-
return entry;
|
|
1415
|
-
}
|
|
1416
|
-
|
|
1417
|
-
/**
|
|
1418
|
-
* Smallest entry whose key is >= the given key.
|
|
1419
1122
|
|
|
1420
1123
|
|
|
1421
1124
|
|
|
@@ -1458,18 +1161,2569 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1458
1161
|
|
|
1459
1162
|
|
|
1460
1163
|
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
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
|
+
* @example
|
|
1233
|
+
* // Remove all
|
|
1234
|
+
* const tm = new TreeMap<number, string>([[1, 'a']]);
|
|
1235
|
+
* tm.clear();
|
|
1236
|
+
* console.log(tm.isEmpty()); // true;
|
|
1237
|
+
*/
|
|
1238
|
+
clear(): void {
|
|
1239
|
+
this.#core.clear();
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
/**
|
|
1243
|
+
* Iterate over keys in ascending order.
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
|
|
1247
|
+
|
|
1248
|
+
|
|
1249
|
+
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
|
|
1312
|
+
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
|
|
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
|
+
* @example
|
|
1403
|
+
* // Get sorted keys
|
|
1404
|
+
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
|
|
1405
|
+
* console.log([...tm.keys()]); // [1, 3];
|
|
1406
|
+
*/
|
|
1407
|
+
keys(): IterableIterator<K> {
|
|
1408
|
+
return this.#core.keys();
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
private _entryFromKey(k: K): [K, V | undefined] {
|
|
1412
|
+
// Keys come from `keys()` which only yields existing keys.
|
|
1413
|
+
// We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
|
|
1414
|
+
return [k, this.#core.get(k)];
|
|
1415
|
+
}
|
|
1416
|
+
|
|
1417
|
+
/**
|
|
1418
|
+
* Iterate over values in ascending key order.
|
|
1419
|
+
*
|
|
1420
|
+
* Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
|
|
1528
|
+
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
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
|
+
* @example
|
|
1580
|
+
* // Get values in key order
|
|
1581
|
+
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
1582
|
+
* console.log([...tm.values()]); // ['a', 'b'];
|
|
1583
|
+
*/
|
|
1584
|
+
*values(): IterableIterator<V | undefined> {
|
|
1585
|
+
for (const k of this.keys()) yield this._entryFromKey(k)[1];
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
/**
|
|
1589
|
+
* Iterate over `[key, value]` entries in ascending key order.
|
|
1590
|
+
*
|
|
1591
|
+
* Note: values may be `undefined`.
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
|
|
1629
|
+
|
|
1630
|
+
|
|
1631
|
+
|
|
1632
|
+
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
|
|
1639
|
+
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
|
|
1654
|
+
|
|
1655
|
+
|
|
1656
|
+
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
|
|
1660
|
+
|
|
1661
|
+
|
|
1662
|
+
|
|
1663
|
+
|
|
1664
|
+
|
|
1665
|
+
|
|
1666
|
+
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
|
|
1677
|
+
|
|
1678
|
+
|
|
1679
|
+
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
|
|
1698
|
+
|
|
1699
|
+
|
|
1700
|
+
|
|
1701
|
+
|
|
1702
|
+
|
|
1703
|
+
|
|
1704
|
+
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
|
|
1708
|
+
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
|
|
1733
|
+
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
|
|
1740
|
+
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
|
|
1744
|
+
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
|
|
1750
|
+
* @example
|
|
1751
|
+
* // Iterate key-value pairs
|
|
1752
|
+
* const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
|
|
1753
|
+
* console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
|
|
1754
|
+
*/
|
|
1755
|
+
*entries(): IterableIterator<[K, V | undefined]> {
|
|
1756
|
+
for (const k of this.keys()) yield this._entryFromKey(k);
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
[Symbol.iterator](): IterableIterator<[K, V | undefined]> {
|
|
1760
|
+
return this.entries();
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
/**
|
|
1764
|
+
* Visit each entry in ascending key order.
|
|
1765
|
+
*
|
|
1766
|
+
* Note: callback value may be `undefined`.
|
|
1767
|
+
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
|
|
1775
|
+
|
|
1776
|
+
|
|
1777
|
+
|
|
1778
|
+
|
|
1779
|
+
|
|
1780
|
+
|
|
1781
|
+
|
|
1782
|
+
|
|
1783
|
+
|
|
1784
|
+
|
|
1785
|
+
|
|
1786
|
+
|
|
1787
|
+
|
|
1788
|
+
|
|
1789
|
+
|
|
1790
|
+
|
|
1791
|
+
|
|
1792
|
+
|
|
1793
|
+
|
|
1794
|
+
|
|
1795
|
+
|
|
1796
|
+
|
|
1797
|
+
|
|
1798
|
+
|
|
1799
|
+
|
|
1800
|
+
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
|
|
1812
|
+
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
|
|
1816
|
+
|
|
1817
|
+
|
|
1818
|
+
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
|
|
1834
|
+
|
|
1835
|
+
|
|
1836
|
+
|
|
1837
|
+
|
|
1838
|
+
|
|
1839
|
+
|
|
1840
|
+
|
|
1841
|
+
|
|
1842
|
+
|
|
1843
|
+
|
|
1844
|
+
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
|
|
1848
|
+
|
|
1849
|
+
|
|
1850
|
+
|
|
1851
|
+
|
|
1852
|
+
|
|
1853
|
+
|
|
1854
|
+
|
|
1855
|
+
|
|
1856
|
+
|
|
1857
|
+
|
|
1858
|
+
|
|
1859
|
+
|
|
1860
|
+
|
|
1861
|
+
|
|
1862
|
+
|
|
1863
|
+
|
|
1864
|
+
|
|
1865
|
+
|
|
1866
|
+
|
|
1867
|
+
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
|
|
1871
|
+
|
|
1872
|
+
|
|
1873
|
+
|
|
1874
|
+
|
|
1875
|
+
|
|
1876
|
+
|
|
1877
|
+
|
|
1878
|
+
|
|
1879
|
+
|
|
1880
|
+
|
|
1881
|
+
|
|
1882
|
+
|
|
1883
|
+
|
|
1884
|
+
|
|
1885
|
+
|
|
1886
|
+
|
|
1887
|
+
|
|
1888
|
+
|
|
1889
|
+
|
|
1890
|
+
|
|
1891
|
+
|
|
1892
|
+
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
|
|
1896
|
+
|
|
1897
|
+
|
|
1898
|
+
|
|
1899
|
+
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
|
|
1903
|
+
|
|
1904
|
+
|
|
1905
|
+
|
|
1906
|
+
|
|
1907
|
+
|
|
1908
|
+
|
|
1909
|
+
|
|
1910
|
+
|
|
1911
|
+
|
|
1912
|
+
|
|
1913
|
+
|
|
1914
|
+
|
|
1915
|
+
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
|
|
1919
|
+
|
|
1920
|
+
|
|
1921
|
+
|
|
1922
|
+
|
|
1923
|
+
|
|
1924
|
+
|
|
1925
|
+
* @example
|
|
1926
|
+
* // Execute for each entry
|
|
1927
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
1928
|
+
* const pairs: string[] = [];
|
|
1929
|
+
* tm.forEach((v, k) => pairs.push(`${k}:${v}`));
|
|
1930
|
+
* console.log(pairs); // ['1:a', '2:b'];
|
|
1931
|
+
*/
|
|
1932
|
+
forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: unknown): void {
|
|
1933
|
+
for (const [k, v] of this) cb.call(thisArg, v, k, this);
|
|
1934
|
+
}
|
|
1935
|
+
|
|
1936
|
+
/**
|
|
1937
|
+
* Create a new TreeMap by mapping each entry to a new `[key, value]` entry.
|
|
1938
|
+
*
|
|
1939
|
+
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
1940
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1941
|
+
|
|
1942
|
+
|
|
1943
|
+
|
|
1944
|
+
|
|
1945
|
+
|
|
1946
|
+
|
|
1947
|
+
|
|
1948
|
+
|
|
1949
|
+
|
|
1950
|
+
|
|
1951
|
+
|
|
1952
|
+
|
|
1953
|
+
|
|
1954
|
+
|
|
1955
|
+
|
|
1956
|
+
|
|
1957
|
+
|
|
1958
|
+
|
|
1959
|
+
|
|
1960
|
+
|
|
1961
|
+
|
|
1962
|
+
|
|
1963
|
+
|
|
1964
|
+
|
|
1965
|
+
|
|
1966
|
+
|
|
1967
|
+
|
|
1968
|
+
|
|
1969
|
+
|
|
1970
|
+
|
|
1971
|
+
|
|
1972
|
+
|
|
1973
|
+
|
|
1974
|
+
|
|
1975
|
+
|
|
1976
|
+
|
|
1977
|
+
|
|
1978
|
+
|
|
1979
|
+
|
|
1980
|
+
|
|
1981
|
+
|
|
1982
|
+
|
|
1983
|
+
|
|
1984
|
+
|
|
1985
|
+
|
|
1986
|
+
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
|
|
1993
|
+
|
|
1994
|
+
|
|
1995
|
+
|
|
1996
|
+
|
|
1997
|
+
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
|
|
2001
|
+
|
|
2002
|
+
|
|
2003
|
+
|
|
2004
|
+
|
|
2005
|
+
|
|
2006
|
+
|
|
2007
|
+
|
|
2008
|
+
|
|
2009
|
+
|
|
2010
|
+
|
|
2011
|
+
|
|
2012
|
+
|
|
2013
|
+
|
|
2014
|
+
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
|
|
2018
|
+
|
|
2019
|
+
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
|
|
2029
|
+
|
|
2030
|
+
|
|
2031
|
+
|
|
2032
|
+
|
|
2033
|
+
|
|
2034
|
+
|
|
2035
|
+
|
|
2036
|
+
|
|
2037
|
+
|
|
2038
|
+
|
|
2039
|
+
|
|
2040
|
+
|
|
2041
|
+
|
|
2042
|
+
|
|
2043
|
+
|
|
2044
|
+
|
|
2045
|
+
|
|
2046
|
+
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
|
|
2050
|
+
|
|
2051
|
+
|
|
2052
|
+
|
|
2053
|
+
|
|
2054
|
+
|
|
2055
|
+
|
|
2056
|
+
|
|
2057
|
+
|
|
2058
|
+
|
|
2059
|
+
|
|
2060
|
+
|
|
2061
|
+
|
|
2062
|
+
|
|
2063
|
+
|
|
2064
|
+
|
|
2065
|
+
|
|
2066
|
+
|
|
2067
|
+
|
|
2068
|
+
|
|
2069
|
+
|
|
2070
|
+
|
|
2071
|
+
|
|
2072
|
+
|
|
2073
|
+
|
|
2074
|
+
|
|
2075
|
+
|
|
2076
|
+
|
|
2077
|
+
|
|
2078
|
+
|
|
2079
|
+
|
|
2080
|
+
|
|
2081
|
+
|
|
2082
|
+
|
|
2083
|
+
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
|
|
2091
|
+
|
|
2092
|
+
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
|
|
2096
|
+
|
|
2097
|
+
|
|
2098
|
+
|
|
2099
|
+
* @example
|
|
2100
|
+
* // Transform entries
|
|
2101
|
+
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
2102
|
+
* const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
|
|
2103
|
+
* console.log([...doubled.values()]); // [20, 40];
|
|
2104
|
+
*/
|
|
2105
|
+
map<MK, MV>(
|
|
2106
|
+
callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
|
|
2107
|
+
options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
2108
|
+
thisArg?: unknown
|
|
2109
|
+
): TreeMap<MK, MV> {
|
|
2110
|
+
const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
|
|
2111
|
+
let index = 0;
|
|
2112
|
+
for (const [k, v] of this) {
|
|
2113
|
+
const [mk, mv] = thisArg === undefined
|
|
2114
|
+
? callbackfn(v, k, index++, this)
|
|
2115
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
|
|
2116
|
+
out.set(mk, mv);
|
|
2117
|
+
}
|
|
2118
|
+
return out;
|
|
2119
|
+
}
|
|
2120
|
+
|
|
2121
|
+
/**
|
|
2122
|
+
* Create a new TreeMap containing only entries that satisfy the predicate.
|
|
2123
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
2124
|
+
|
|
2125
|
+
|
|
2126
|
+
|
|
2127
|
+
|
|
2128
|
+
|
|
2129
|
+
|
|
2130
|
+
|
|
2131
|
+
|
|
2132
|
+
|
|
2133
|
+
|
|
2134
|
+
|
|
2135
|
+
|
|
2136
|
+
|
|
2137
|
+
|
|
2138
|
+
|
|
2139
|
+
|
|
2140
|
+
|
|
2141
|
+
|
|
2142
|
+
|
|
2143
|
+
|
|
2144
|
+
|
|
2145
|
+
|
|
2146
|
+
|
|
2147
|
+
|
|
2148
|
+
|
|
2149
|
+
|
|
2150
|
+
|
|
2151
|
+
|
|
2152
|
+
|
|
2153
|
+
|
|
2154
|
+
|
|
2155
|
+
|
|
2156
|
+
|
|
2157
|
+
|
|
2158
|
+
|
|
2159
|
+
|
|
2160
|
+
|
|
2161
|
+
|
|
2162
|
+
|
|
2163
|
+
|
|
2164
|
+
|
|
2165
|
+
|
|
2166
|
+
|
|
2167
|
+
|
|
2168
|
+
|
|
2169
|
+
|
|
2170
|
+
|
|
2171
|
+
|
|
2172
|
+
|
|
2173
|
+
|
|
2174
|
+
|
|
2175
|
+
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
|
|
2182
|
+
|
|
2183
|
+
|
|
2184
|
+
|
|
2185
|
+
|
|
2186
|
+
|
|
2187
|
+
|
|
2188
|
+
|
|
2189
|
+
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
|
|
2193
|
+
|
|
2194
|
+
|
|
2195
|
+
|
|
2196
|
+
|
|
2197
|
+
|
|
2198
|
+
|
|
2199
|
+
|
|
2200
|
+
|
|
2201
|
+
|
|
2202
|
+
|
|
2203
|
+
|
|
2204
|
+
|
|
2205
|
+
|
|
2206
|
+
|
|
2207
|
+
|
|
2208
|
+
|
|
2209
|
+
|
|
2210
|
+
|
|
2211
|
+
|
|
2212
|
+
|
|
2213
|
+
|
|
2214
|
+
|
|
2215
|
+
|
|
2216
|
+
|
|
2217
|
+
|
|
2218
|
+
|
|
2219
|
+
|
|
2220
|
+
|
|
2221
|
+
|
|
2222
|
+
|
|
2223
|
+
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
|
|
2227
|
+
|
|
2228
|
+
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
|
|
2232
|
+
|
|
2233
|
+
|
|
2234
|
+
|
|
2235
|
+
|
|
2236
|
+
|
|
2237
|
+
|
|
2238
|
+
|
|
2239
|
+
|
|
2240
|
+
|
|
2241
|
+
|
|
2242
|
+
|
|
2243
|
+
|
|
2244
|
+
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
|
|
2249
|
+
|
|
2250
|
+
|
|
2251
|
+
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
|
|
2255
|
+
|
|
2256
|
+
|
|
2257
|
+
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
|
|
2261
|
+
|
|
2262
|
+
|
|
2263
|
+
|
|
2264
|
+
|
|
2265
|
+
|
|
2266
|
+
|
|
2267
|
+
|
|
2268
|
+
|
|
2269
|
+
|
|
2270
|
+
|
|
2271
|
+
|
|
2272
|
+
|
|
2273
|
+
|
|
2274
|
+
|
|
2275
|
+
|
|
2276
|
+
|
|
2277
|
+
|
|
2278
|
+
|
|
2279
|
+
|
|
2280
|
+
|
|
2281
|
+
|
|
2282
|
+
* @example
|
|
2283
|
+
* // Filter entries
|
|
2284
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
|
|
2285
|
+
* const filtered = tm.filter((v, k) => k > 1);
|
|
2286
|
+
* console.log([...filtered.keys()]); // [2, 3];
|
|
2287
|
+
*/
|
|
2288
|
+
filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
|
|
2289
|
+
const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
|
|
2290
|
+
let index = 0;
|
|
2291
|
+
for (const [k, v] of this) {
|
|
2292
|
+
const ok = thisArg === undefined
|
|
2293
|
+
? callbackfn(v, k, index++, this)
|
|
2294
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2295
|
+
if (ok) out.set(k, v);
|
|
2296
|
+
}
|
|
2297
|
+
return out;
|
|
2298
|
+
}
|
|
2299
|
+
|
|
2300
|
+
/**
|
|
2301
|
+
* Reduce entries into a single accumulator.
|
|
2302
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
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
|
+
* @example
|
|
2462
|
+
* // Aggregate values
|
|
2463
|
+
* const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
|
|
2464
|
+
* console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
|
|
2465
|
+
*/
|
|
2466
|
+
reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
|
|
2467
|
+
let acc = initialValue;
|
|
2468
|
+
let index = 0;
|
|
2469
|
+
for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
|
|
2470
|
+
return acc;
|
|
2471
|
+
}
|
|
2472
|
+
|
|
2473
|
+
/**
|
|
2474
|
+
* Test whether all entries satisfy a predicate.
|
|
2475
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
2583
|
+
|
|
2584
|
+
|
|
2585
|
+
|
|
2586
|
+
|
|
2587
|
+
|
|
2588
|
+
|
|
2589
|
+
|
|
2590
|
+
|
|
2591
|
+
|
|
2592
|
+
|
|
2593
|
+
|
|
2594
|
+
|
|
2595
|
+
|
|
2596
|
+
|
|
2597
|
+
|
|
2598
|
+
|
|
2599
|
+
|
|
2600
|
+
|
|
2601
|
+
|
|
2602
|
+
|
|
2603
|
+
|
|
2604
|
+
|
|
2605
|
+
|
|
2606
|
+
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
|
|
2610
|
+
|
|
2611
|
+
|
|
2612
|
+
|
|
2613
|
+
|
|
2614
|
+
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
|
|
2618
|
+
|
|
2619
|
+
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
|
|
2623
|
+
|
|
2624
|
+
|
|
2625
|
+
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
|
|
2629
|
+
|
|
2630
|
+
|
|
2631
|
+
|
|
2632
|
+
* @example
|
|
2633
|
+
* // Test all entries
|
|
2634
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
2635
|
+
* console.log(tm.every((v, k) => k > 0)); // true;
|
|
2636
|
+
*/
|
|
2637
|
+
every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
|
|
2638
|
+
let index = 0;
|
|
2639
|
+
for (const [k, v] of this) {
|
|
2640
|
+
const ok = thisArg === undefined
|
|
2641
|
+
? callbackfn(v, k, index++, this)
|
|
2642
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2643
|
+
if (!ok) return false;
|
|
2644
|
+
}
|
|
2645
|
+
return true;
|
|
2646
|
+
}
|
|
2647
|
+
|
|
2648
|
+
/**
|
|
2649
|
+
* Test whether any entry satisfies a predicate.
|
|
2650
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
2752
|
+
|
|
2753
|
+
|
|
2754
|
+
|
|
2755
|
+
|
|
2756
|
+
|
|
2757
|
+
|
|
2758
|
+
|
|
2759
|
+
|
|
2760
|
+
|
|
2761
|
+
|
|
2762
|
+
|
|
2763
|
+
|
|
2764
|
+
|
|
2765
|
+
|
|
2766
|
+
|
|
2767
|
+
|
|
2768
|
+
|
|
2769
|
+
|
|
2770
|
+
|
|
2771
|
+
|
|
2772
|
+
|
|
2773
|
+
|
|
2774
|
+
|
|
2775
|
+
|
|
2776
|
+
|
|
2777
|
+
|
|
2778
|
+
|
|
2779
|
+
|
|
2780
|
+
|
|
2781
|
+
|
|
2782
|
+
|
|
2783
|
+
|
|
2784
|
+
|
|
2785
|
+
|
|
2786
|
+
|
|
2787
|
+
|
|
2788
|
+
|
|
2789
|
+
|
|
2790
|
+
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
|
|
2800
|
+
|
|
2801
|
+
|
|
2802
|
+
|
|
2803
|
+
|
|
2804
|
+
|
|
2805
|
+
|
|
2806
|
+
|
|
2807
|
+
* @example
|
|
2808
|
+
* // Test any entry
|
|
2809
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
2810
|
+
* console.log(tm.some((v, k) => k === 2)); // true;
|
|
2811
|
+
*/
|
|
2812
|
+
some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
|
|
2813
|
+
let index = 0;
|
|
2814
|
+
for (const [k, v] of this) {
|
|
2815
|
+
const ok = thisArg === undefined
|
|
2816
|
+
? callbackfn(v, k, index++, this)
|
|
2817
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2818
|
+
if (ok) return true;
|
|
2819
|
+
}
|
|
2820
|
+
return false;
|
|
2821
|
+
}
|
|
2822
|
+
|
|
2823
|
+
/**
|
|
2824
|
+
* Find the first entry that satisfies a predicate.
|
|
2825
|
+
* @returns The first matching `[key, value]` tuple, or `undefined`.
|
|
2826
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
|
|
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
|
+
* @example
|
|
2984
|
+
* // Find matching entry
|
|
2985
|
+
* const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
|
|
2986
|
+
* console.log(tm.find(v => v === 'b')?.[0]); // 2;
|
|
2987
|
+
*/
|
|
2988
|
+
find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
|
|
2989
|
+
let index = 0;
|
|
2990
|
+
for (const [k, v] of this) {
|
|
2991
|
+
const ok = thisArg === undefined
|
|
2992
|
+
? callbackfn(v, k, index++, this)
|
|
2993
|
+
: (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
|
|
2994
|
+
if (ok) return [k, v];
|
|
2995
|
+
}
|
|
2996
|
+
return undefined;
|
|
2997
|
+
}
|
|
2998
|
+
|
|
2999
|
+
/**
|
|
3000
|
+
* Materialize the map into an array of `[key, value]` tuples.
|
|
3001
|
+
* @remarks Time O(n), Space O(n)
|
|
3002
|
+
|
|
3003
|
+
|
|
3004
|
+
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
|
|
3008
|
+
|
|
3009
|
+
|
|
3010
|
+
|
|
3011
|
+
|
|
3012
|
+
|
|
3013
|
+
|
|
3014
|
+
|
|
3015
|
+
|
|
3016
|
+
|
|
3017
|
+
|
|
3018
|
+
|
|
3019
|
+
|
|
3020
|
+
|
|
3021
|
+
|
|
3022
|
+
|
|
3023
|
+
|
|
3024
|
+
|
|
3025
|
+
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
|
|
3029
|
+
|
|
3030
|
+
|
|
3031
|
+
|
|
3032
|
+
|
|
3033
|
+
|
|
3034
|
+
|
|
3035
|
+
|
|
3036
|
+
|
|
3037
|
+
|
|
3038
|
+
|
|
3039
|
+
|
|
3040
|
+
|
|
3041
|
+
|
|
3042
|
+
|
|
3043
|
+
|
|
3044
|
+
|
|
3045
|
+
|
|
3046
|
+
|
|
3047
|
+
|
|
3048
|
+
|
|
3049
|
+
|
|
3050
|
+
|
|
3051
|
+
|
|
3052
|
+
|
|
3053
|
+
|
|
3054
|
+
|
|
3055
|
+
|
|
3056
|
+
|
|
3057
|
+
|
|
3058
|
+
|
|
3059
|
+
|
|
3060
|
+
|
|
3061
|
+
|
|
3062
|
+
|
|
3063
|
+
|
|
3064
|
+
|
|
3065
|
+
|
|
3066
|
+
|
|
3067
|
+
|
|
3068
|
+
|
|
3069
|
+
|
|
3070
|
+
|
|
3071
|
+
|
|
3072
|
+
|
|
3073
|
+
|
|
3074
|
+
|
|
3075
|
+
|
|
3076
|
+
|
|
3077
|
+
|
|
3078
|
+
|
|
3079
|
+
|
|
3080
|
+
|
|
3081
|
+
|
|
3082
|
+
|
|
3083
|
+
|
|
3084
|
+
|
|
3085
|
+
|
|
3086
|
+
|
|
3087
|
+
|
|
3088
|
+
|
|
3089
|
+
|
|
3090
|
+
|
|
3091
|
+
|
|
3092
|
+
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
|
|
3096
|
+
|
|
3097
|
+
|
|
3098
|
+
|
|
3099
|
+
|
|
3100
|
+
|
|
3101
|
+
|
|
3102
|
+
|
|
3103
|
+
|
|
3104
|
+
|
|
3105
|
+
|
|
3106
|
+
|
|
3107
|
+
|
|
3108
|
+
|
|
3109
|
+
|
|
3110
|
+
|
|
3111
|
+
|
|
3112
|
+
|
|
3113
|
+
|
|
3114
|
+
|
|
3115
|
+
|
|
3116
|
+
|
|
3117
|
+
|
|
3118
|
+
|
|
3119
|
+
|
|
3120
|
+
|
|
3121
|
+
|
|
3122
|
+
|
|
3123
|
+
|
|
3124
|
+
|
|
3125
|
+
|
|
3126
|
+
|
|
3127
|
+
|
|
3128
|
+
|
|
3129
|
+
|
|
3130
|
+
|
|
3131
|
+
|
|
3132
|
+
|
|
3133
|
+
|
|
3134
|
+
|
|
3135
|
+
|
|
3136
|
+
|
|
3137
|
+
|
|
3138
|
+
|
|
3139
|
+
|
|
3140
|
+
|
|
3141
|
+
|
|
3142
|
+
|
|
3143
|
+
|
|
3144
|
+
|
|
3145
|
+
|
|
3146
|
+
|
|
3147
|
+
|
|
3148
|
+
|
|
3149
|
+
|
|
3150
|
+
|
|
3151
|
+
|
|
3152
|
+
|
|
3153
|
+
|
|
3154
|
+
|
|
3155
|
+
|
|
3156
|
+
|
|
3157
|
+
|
|
3158
|
+
|
|
3159
|
+
|
|
3160
|
+
* @example
|
|
3161
|
+
* // Convert to array
|
|
3162
|
+
* const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
|
|
3163
|
+
* console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
|
|
3164
|
+
*/
|
|
3165
|
+
toArray(): Array<[K, V | undefined]> {
|
|
3166
|
+
return [...this];
|
|
3167
|
+
}
|
|
3168
|
+
|
|
3169
|
+
/**
|
|
3170
|
+
* Print a human-friendly representation.
|
|
3171
|
+
* @remarks Time O(n), Space O(n)
|
|
3172
|
+
|
|
3173
|
+
|
|
3174
|
+
|
|
3175
|
+
|
|
3176
|
+
|
|
3177
|
+
|
|
3178
|
+
|
|
3179
|
+
|
|
3180
|
+
|
|
3181
|
+
|
|
3182
|
+
|
|
3183
|
+
|
|
3184
|
+
|
|
3185
|
+
|
|
3186
|
+
|
|
3187
|
+
|
|
3188
|
+
|
|
3189
|
+
|
|
3190
|
+
|
|
3191
|
+
|
|
3192
|
+
|
|
3193
|
+
|
|
3194
|
+
|
|
3195
|
+
|
|
3196
|
+
|
|
3197
|
+
|
|
3198
|
+
|
|
3199
|
+
|
|
3200
|
+
|
|
3201
|
+
|
|
3202
|
+
|
|
3203
|
+
|
|
3204
|
+
|
|
3205
|
+
|
|
3206
|
+
|
|
3207
|
+
|
|
3208
|
+
|
|
3209
|
+
|
|
3210
|
+
|
|
3211
|
+
|
|
3212
|
+
|
|
3213
|
+
|
|
3214
|
+
|
|
3215
|
+
|
|
3216
|
+
|
|
3217
|
+
|
|
3218
|
+
|
|
3219
|
+
|
|
3220
|
+
|
|
3221
|
+
|
|
3222
|
+
|
|
3223
|
+
|
|
3224
|
+
|
|
3225
|
+
|
|
3226
|
+
|
|
3227
|
+
|
|
3228
|
+
|
|
3229
|
+
|
|
3230
|
+
|
|
3231
|
+
|
|
3232
|
+
|
|
3233
|
+
|
|
3234
|
+
|
|
3235
|
+
|
|
3236
|
+
|
|
3237
|
+
|
|
3238
|
+
|
|
3239
|
+
|
|
3240
|
+
|
|
3241
|
+
|
|
3242
|
+
|
|
3243
|
+
|
|
3244
|
+
|
|
3245
|
+
|
|
3246
|
+
|
|
3247
|
+
|
|
3248
|
+
|
|
3249
|
+
|
|
3250
|
+
|
|
3251
|
+
|
|
3252
|
+
|
|
3253
|
+
|
|
3254
|
+
|
|
3255
|
+
|
|
3256
|
+
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
|
|
3260
|
+
|
|
3261
|
+
|
|
3262
|
+
|
|
3263
|
+
|
|
3264
|
+
|
|
3265
|
+
|
|
3266
|
+
|
|
3267
|
+
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
|
|
3271
|
+
|
|
3272
|
+
|
|
3273
|
+
|
|
3274
|
+
|
|
3275
|
+
|
|
3276
|
+
|
|
3277
|
+
|
|
3278
|
+
|
|
3279
|
+
|
|
3280
|
+
|
|
3281
|
+
|
|
3282
|
+
|
|
3283
|
+
|
|
3284
|
+
|
|
3285
|
+
|
|
3286
|
+
|
|
3287
|
+
|
|
3288
|
+
|
|
3289
|
+
|
|
3290
|
+
|
|
3291
|
+
|
|
3292
|
+
|
|
3293
|
+
|
|
3294
|
+
|
|
3295
|
+
|
|
3296
|
+
|
|
3297
|
+
|
|
3298
|
+
|
|
3299
|
+
|
|
3300
|
+
|
|
3301
|
+
|
|
3302
|
+
|
|
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
|
+
* @example
|
|
3331
|
+
* // Display tree
|
|
3332
|
+
* const tm = new TreeMap<number, string>([[1, 'a']]);
|
|
3333
|
+
* expect(() => tm.print()).not.toThrow();
|
|
3334
|
+
*/
|
|
3335
|
+
print(): void {
|
|
3336
|
+
// Delegate to the underlying tree's visualization.
|
|
3337
|
+
this.#core.print();
|
|
3338
|
+
}
|
|
3339
|
+
|
|
3340
|
+
// Navigable operations (return entry tuples)
|
|
3341
|
+
// Note: returned tuple values may be `undefined`.
|
|
3342
|
+
|
|
3343
|
+
/**
|
|
3344
|
+
* Smallest entry by key.
|
|
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
|
+
* @example
|
|
3381
|
+
* // Leaderboard with ranked scores
|
|
3382
|
+
* // Use score as key (descending), player name as value
|
|
3383
|
+
* const leaderboard = new TreeMap<number, string>([], {
|
|
3384
|
+
* comparator: (a, b) => b - a // descending
|
|
3385
|
+
* });
|
|
3386
|
+
*
|
|
3387
|
+
* leaderboard.set(1500, 'Alice');
|
|
3388
|
+
* leaderboard.set(2200, 'Bob');
|
|
3389
|
+
* leaderboard.set(1800, 'Charlie');
|
|
3390
|
+
* leaderboard.set(2500, 'Diana');
|
|
3391
|
+
*
|
|
3392
|
+
* // Top 3 players (first 3 in descending order)
|
|
3393
|
+
* const top3 = [...leaderboard.entries()].slice(0, 3);
|
|
3394
|
+
* console.log(top3); // [
|
|
3395
|
+
* // [2500, 'Diana'],
|
|
3396
|
+
* // [2200, 'Bob'],
|
|
3397
|
+
* // [1800, 'Charlie']
|
|
3398
|
+
* // ];
|
|
3399
|
+
*
|
|
3400
|
+
* // Highest scorer
|
|
3401
|
+
* console.log(leaderboard.first()); // [2500, 'Diana'];
|
|
3402
|
+
*
|
|
3403
|
+
* // Remove lowest scorer
|
|
3404
|
+
* console.log(leaderboard.pollLast()); // [1500, 'Alice'];
|
|
3405
|
+
* console.log(leaderboard.size); // 3;
|
|
3406
|
+
*/
|
|
3407
|
+
first(): [K, V | undefined] | undefined {
|
|
3408
|
+
const k = this.#core.getLeftMost();
|
|
3409
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3410
|
+
}
|
|
3411
|
+
|
|
3412
|
+
/**
|
|
3413
|
+
* Largest entry by key.
|
|
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
|
+
* @example
|
|
3450
|
+
* // Access the maximum entry
|
|
3451
|
+
* const scores = new TreeMap<number, string>([
|
|
3452
|
+
* [85, 'Bob'],
|
|
3453
|
+
* [92, 'Alice'],
|
|
3454
|
+
* [78, 'Charlie']
|
|
3455
|
+
* ]);
|
|
3456
|
+
*
|
|
3457
|
+
* console.log(scores.last()); // [92, 'Alice'];
|
|
3458
|
+
* console.log(scores.first()); // [78, 'Charlie'];
|
|
3459
|
+
*/
|
|
3460
|
+
last(): [K, V | undefined] | undefined {
|
|
3461
|
+
const k = this.#core.getRightMost();
|
|
3462
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3463
|
+
}
|
|
3464
|
+
|
|
3465
|
+
/**
|
|
3466
|
+
* Remove and return the smallest entry.
|
|
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
|
+
* @example
|
|
3503
|
+
* // Process items from lowest priority
|
|
3504
|
+
* const tasks = new TreeMap<number, string>([
|
|
3505
|
+
* [3, 'Low'],
|
|
3506
|
+
* [1, 'Critical'],
|
|
3507
|
+
* [2, 'Medium']
|
|
3508
|
+
* ]);
|
|
3509
|
+
*
|
|
3510
|
+
* // Process lowest priority first
|
|
3511
|
+
* console.log(tasks.pollFirst()); // [1, 'Critical'];
|
|
3512
|
+
* console.log(tasks.pollFirst()); // [2, 'Medium'];
|
|
3513
|
+
* console.log(tasks.size); // 1;
|
|
3514
|
+
*/
|
|
3515
|
+
pollFirst(): [K, V | undefined] | undefined {
|
|
3516
|
+
const entry = this.first();
|
|
3517
|
+
if (!entry) return undefined;
|
|
3518
|
+
this.delete(entry[0]);
|
|
3519
|
+
return entry;
|
|
3520
|
+
}
|
|
3521
|
+
|
|
3522
|
+
/**
|
|
3523
|
+
* Remove and return the largest entry.
|
|
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
|
+
* @example
|
|
3560
|
+
* // Remove the maximum entry
|
|
3561
|
+
* const bids = new TreeMap<number, string>([
|
|
3562
|
+
* [100, 'Alice'],
|
|
3563
|
+
* [150, 'Bob'],
|
|
3564
|
+
* [120, 'Charlie']
|
|
3565
|
+
* ]);
|
|
3566
|
+
*
|
|
3567
|
+
* // Remove highest bid
|
|
3568
|
+
* console.log(bids.pollLast()); // [150, 'Bob'];
|
|
3569
|
+
* console.log(bids.size); // 2;
|
|
3570
|
+
* console.log(bids.last()); // [120, 'Charlie'];
|
|
3571
|
+
*/
|
|
3572
|
+
pollLast(): [K, V | undefined] | undefined {
|
|
3573
|
+
const entry = this.last();
|
|
3574
|
+
if (!entry) return undefined;
|
|
3575
|
+
this.delete(entry[0]);
|
|
3576
|
+
return entry;
|
|
3577
|
+
}
|
|
3578
|
+
|
|
3579
|
+
/**
|
|
3580
|
+
* Smallest entry whose key is >= the given key.
|
|
3581
|
+
|
|
3582
|
+
|
|
3583
|
+
|
|
3584
|
+
|
|
3585
|
+
|
|
3586
|
+
|
|
3587
|
+
|
|
3588
|
+
|
|
3589
|
+
|
|
3590
|
+
|
|
3591
|
+
|
|
3592
|
+
|
|
3593
|
+
|
|
3594
|
+
|
|
3595
|
+
|
|
3596
|
+
|
|
3597
|
+
|
|
3598
|
+
|
|
3599
|
+
|
|
3600
|
+
|
|
3601
|
+
|
|
3602
|
+
|
|
3603
|
+
|
|
3604
|
+
|
|
3605
|
+
|
|
3606
|
+
|
|
3607
|
+
|
|
3608
|
+
|
|
3609
|
+
|
|
3610
|
+
|
|
3611
|
+
|
|
3612
|
+
|
|
3613
|
+
|
|
3614
|
+
|
|
3615
|
+
|
|
3616
|
+
|
|
3617
|
+
|
|
3618
|
+
|
|
3619
|
+
|
|
3620
|
+
|
|
3621
|
+
|
|
3622
|
+
|
|
3623
|
+
|
|
3624
|
+
|
|
3625
|
+
|
|
3626
|
+
|
|
3627
|
+
|
|
3628
|
+
|
|
3629
|
+
|
|
3630
|
+
|
|
3631
|
+
|
|
3632
|
+
|
|
3633
|
+
|
|
3634
|
+
|
|
3635
|
+
|
|
3636
|
+
|
|
3637
|
+
|
|
3638
|
+
|
|
3639
|
+
|
|
3640
|
+
|
|
3641
|
+
|
|
3642
|
+
|
|
3643
|
+
|
|
3644
|
+
|
|
3645
|
+
|
|
3646
|
+
|
|
3647
|
+
|
|
3648
|
+
|
|
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
|
+
* @example
|
|
3716
|
+
* // Event scheduler with time-based lookup
|
|
3717
|
+
* const events = new TreeMap<Date, string>();
|
|
3718
|
+
*
|
|
3719
|
+
* const meeting = new Date('2024-01-15T10:00:00Z');
|
|
3720
|
+
* const lunch = new Date('2024-01-15T12:00:00Z');
|
|
3721
|
+
* const review = new Date('2024-01-15T15:00:00Z');
|
|
3722
|
+
* const standup = new Date('2024-01-15T09:00:00Z');
|
|
3723
|
+
*
|
|
3724
|
+
* events.set(meeting, 'Team Meeting');
|
|
3725
|
+
* events.set(lunch, 'Lunch Break');
|
|
3726
|
+
* events.set(review, 'Code Review');
|
|
1473
3727
|
* events.set(standup, 'Daily Standup');
|
|
1474
3728
|
*
|
|
1475
3729
|
* // Events are sorted chronologically
|
|
@@ -1480,24 +3734,432 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1480
3734
|
* // 'Code Review'
|
|
1481
3735
|
* // ];
|
|
1482
3736
|
*
|
|
1483
|
-
* // Next event after 11:00
|
|
1484
|
-
* const after11 = new Date('2024-01-15T11:00:00Z');
|
|
1485
|
-
* console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
|
|
3737
|
+
* // Next event after 11:00
|
|
3738
|
+
* const after11 = new Date('2024-01-15T11:00:00Z');
|
|
3739
|
+
* console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
|
|
3740
|
+
*
|
|
3741
|
+
* // Events between 9:30 and 13:00
|
|
3742
|
+
* const from = new Date('2024-01-15T09:30:00Z');
|
|
3743
|
+
* const to = new Date('2024-01-15T13:00:00Z');
|
|
3744
|
+
* const window = events.rangeSearch([from, to]);
|
|
3745
|
+
* console.log(window.map(([, v]) => v)); // ['Team Meeting', 'Lunch Break'];
|
|
3746
|
+
*/
|
|
3747
|
+
ceiling(key: K): [K, V | undefined] | undefined {
|
|
3748
|
+
this._validateKey(key);
|
|
3749
|
+
const k = this.#core.ceiling(key);
|
|
3750
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3751
|
+
}
|
|
3752
|
+
|
|
3753
|
+
/**
|
|
3754
|
+
* Largest entry whose key is <= the given key.
|
|
3755
|
+
|
|
3756
|
+
|
|
3757
|
+
|
|
3758
|
+
|
|
3759
|
+
|
|
3760
|
+
|
|
3761
|
+
|
|
3762
|
+
|
|
3763
|
+
|
|
3764
|
+
|
|
3765
|
+
|
|
3766
|
+
|
|
3767
|
+
|
|
3768
|
+
|
|
3769
|
+
|
|
3770
|
+
|
|
3771
|
+
|
|
3772
|
+
|
|
3773
|
+
|
|
3774
|
+
|
|
3775
|
+
|
|
3776
|
+
|
|
3777
|
+
|
|
3778
|
+
|
|
3779
|
+
|
|
3780
|
+
|
|
3781
|
+
|
|
3782
|
+
|
|
3783
|
+
|
|
3784
|
+
|
|
3785
|
+
|
|
3786
|
+
|
|
3787
|
+
|
|
3788
|
+
|
|
3789
|
+
|
|
3790
|
+
|
|
3791
|
+
|
|
3792
|
+
|
|
3793
|
+
|
|
3794
|
+
|
|
3795
|
+
|
|
3796
|
+
|
|
3797
|
+
|
|
3798
|
+
|
|
3799
|
+
|
|
3800
|
+
|
|
3801
|
+
|
|
3802
|
+
|
|
3803
|
+
|
|
3804
|
+
|
|
3805
|
+
|
|
3806
|
+
|
|
3807
|
+
|
|
3808
|
+
|
|
3809
|
+
|
|
3810
|
+
|
|
3811
|
+
|
|
3812
|
+
|
|
3813
|
+
|
|
3814
|
+
|
|
3815
|
+
|
|
3816
|
+
|
|
3817
|
+
|
|
3818
|
+
|
|
3819
|
+
|
|
3820
|
+
|
|
3821
|
+
|
|
3822
|
+
|
|
3823
|
+
|
|
3824
|
+
|
|
3825
|
+
|
|
3826
|
+
|
|
3827
|
+
|
|
3828
|
+
|
|
3829
|
+
|
|
3830
|
+
|
|
3831
|
+
|
|
3832
|
+
|
|
3833
|
+
|
|
3834
|
+
|
|
3835
|
+
|
|
3836
|
+
|
|
3837
|
+
|
|
3838
|
+
|
|
3839
|
+
|
|
3840
|
+
|
|
3841
|
+
|
|
3842
|
+
|
|
3843
|
+
|
|
3844
|
+
|
|
3845
|
+
|
|
3846
|
+
|
|
3847
|
+
|
|
3848
|
+
|
|
3849
|
+
|
|
3850
|
+
|
|
3851
|
+
|
|
3852
|
+
|
|
3853
|
+
|
|
3854
|
+
|
|
3855
|
+
|
|
3856
|
+
|
|
3857
|
+
|
|
3858
|
+
|
|
3859
|
+
|
|
3860
|
+
|
|
3861
|
+
|
|
3862
|
+
|
|
3863
|
+
|
|
3864
|
+
|
|
3865
|
+
|
|
3866
|
+
|
|
3867
|
+
|
|
3868
|
+
|
|
3869
|
+
|
|
3870
|
+
|
|
3871
|
+
|
|
3872
|
+
|
|
3873
|
+
|
|
3874
|
+
|
|
3875
|
+
|
|
3876
|
+
|
|
3877
|
+
|
|
3878
|
+
|
|
3879
|
+
|
|
3880
|
+
|
|
3881
|
+
|
|
3882
|
+
|
|
3883
|
+
|
|
3884
|
+
|
|
3885
|
+
|
|
3886
|
+
|
|
3887
|
+
|
|
3888
|
+
|
|
3889
|
+
* @example
|
|
3890
|
+
* // Find the largest key ≤ target
|
|
3891
|
+
* const versions = new TreeMap<number, string>([
|
|
3892
|
+
* [1, 'v1.0'],
|
|
3893
|
+
* [3, 'v3.0'],
|
|
3894
|
+
* [5, 'v5.0'],
|
|
3895
|
+
* [7, 'v7.0']
|
|
3896
|
+
* ]);
|
|
3897
|
+
*
|
|
3898
|
+
* // Largest version ≤ 4
|
|
3899
|
+
* console.log(versions.floor(4)); // [3, 'v3.0'];
|
|
3900
|
+
* // Largest version ≤ 5 (exact match)
|
|
3901
|
+
* console.log(versions.floor(5)); // [5, 'v5.0'];
|
|
3902
|
+
* // No version ≤ 0
|
|
3903
|
+
* console.log(versions.floor(0)); // undefined;
|
|
3904
|
+
*/
|
|
3905
|
+
floor(key: K): [K, V | undefined] | undefined {
|
|
3906
|
+
this._validateKey(key);
|
|
3907
|
+
const k = this.#core.floor(key);
|
|
3908
|
+
return k === undefined ? undefined : this._entryFromKey(k);
|
|
3909
|
+
}
|
|
3910
|
+
|
|
3911
|
+
/**
|
|
3912
|
+
* Smallest entry whose key is > the given key.
|
|
3913
|
+
|
|
3914
|
+
|
|
3915
|
+
|
|
3916
|
+
|
|
3917
|
+
|
|
3918
|
+
|
|
3919
|
+
|
|
3920
|
+
|
|
3921
|
+
|
|
3922
|
+
|
|
3923
|
+
|
|
3924
|
+
|
|
3925
|
+
|
|
3926
|
+
|
|
3927
|
+
|
|
3928
|
+
|
|
3929
|
+
|
|
3930
|
+
|
|
3931
|
+
|
|
3932
|
+
|
|
3933
|
+
|
|
3934
|
+
|
|
3935
|
+
|
|
3936
|
+
|
|
3937
|
+
|
|
3938
|
+
|
|
3939
|
+
|
|
3940
|
+
|
|
3941
|
+
|
|
3942
|
+
|
|
3943
|
+
|
|
3944
|
+
|
|
3945
|
+
|
|
3946
|
+
|
|
3947
|
+
|
|
3948
|
+
|
|
3949
|
+
|
|
3950
|
+
|
|
3951
|
+
|
|
3952
|
+
|
|
3953
|
+
|
|
3954
|
+
|
|
3955
|
+
|
|
3956
|
+
|
|
3957
|
+
|
|
3958
|
+
|
|
3959
|
+
|
|
3960
|
+
|
|
3961
|
+
|
|
3962
|
+
|
|
3963
|
+
|
|
3964
|
+
|
|
3965
|
+
|
|
3966
|
+
|
|
3967
|
+
|
|
3968
|
+
|
|
3969
|
+
|
|
3970
|
+
|
|
3971
|
+
|
|
3972
|
+
|
|
3973
|
+
|
|
3974
|
+
|
|
3975
|
+
|
|
3976
|
+
|
|
3977
|
+
|
|
3978
|
+
|
|
3979
|
+
|
|
3980
|
+
|
|
3981
|
+
|
|
3982
|
+
|
|
3983
|
+
|
|
3984
|
+
|
|
3985
|
+
|
|
3986
|
+
|
|
3987
|
+
|
|
3988
|
+
|
|
3989
|
+
|
|
3990
|
+
|
|
3991
|
+
|
|
3992
|
+
|
|
3993
|
+
|
|
3994
|
+
|
|
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
|
+
* @example
|
|
4048
|
+
* // Find the smallest key strictly > target
|
|
4049
|
+
* const prices = new TreeMap<number, string>([
|
|
4050
|
+
* [10, 'Basic'],
|
|
4051
|
+
* [25, 'Standard'],
|
|
4052
|
+
* [50, 'Premium'],
|
|
4053
|
+
* [100, 'Enterprise']
|
|
4054
|
+
* ]);
|
|
1486
4055
|
*
|
|
1487
|
-
* //
|
|
1488
|
-
*
|
|
1489
|
-
*
|
|
1490
|
-
*
|
|
1491
|
-
*
|
|
4056
|
+
* // Next tier above $25
|
|
4057
|
+
* console.log(prices.higher(25)); // [50, 'Premium'];
|
|
4058
|
+
* // Next tier above $99
|
|
4059
|
+
* console.log(prices.higher(99)); // [100, 'Enterprise'];
|
|
4060
|
+
* // Nothing above $100
|
|
4061
|
+
* console.log(prices.higher(100)); // undefined;
|
|
1492
4062
|
*/
|
|
1493
|
-
|
|
4063
|
+
higher(key: K): [K, V | undefined] | undefined {
|
|
1494
4064
|
this._validateKey(key);
|
|
1495
|
-
const k = this.#core.
|
|
4065
|
+
const k = this.#core.higher(key);
|
|
1496
4066
|
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1497
4067
|
}
|
|
1498
4068
|
|
|
1499
4069
|
/**
|
|
1500
|
-
* Largest entry whose key is
|
|
4070
|
+
* Largest entry whose key is < the given key.
|
|
4071
|
+
|
|
4072
|
+
|
|
4073
|
+
|
|
4074
|
+
|
|
4075
|
+
|
|
4076
|
+
|
|
4077
|
+
|
|
4078
|
+
|
|
4079
|
+
|
|
4080
|
+
|
|
4081
|
+
|
|
4082
|
+
|
|
4083
|
+
|
|
4084
|
+
|
|
4085
|
+
|
|
4086
|
+
|
|
4087
|
+
|
|
4088
|
+
|
|
4089
|
+
|
|
4090
|
+
|
|
4091
|
+
|
|
4092
|
+
|
|
4093
|
+
|
|
4094
|
+
|
|
4095
|
+
|
|
4096
|
+
|
|
4097
|
+
|
|
4098
|
+
|
|
4099
|
+
|
|
4100
|
+
|
|
4101
|
+
|
|
4102
|
+
|
|
4103
|
+
|
|
4104
|
+
|
|
4105
|
+
|
|
4106
|
+
|
|
4107
|
+
|
|
4108
|
+
|
|
4109
|
+
|
|
4110
|
+
|
|
4111
|
+
|
|
4112
|
+
|
|
4113
|
+
|
|
4114
|
+
|
|
4115
|
+
|
|
4116
|
+
|
|
4117
|
+
|
|
4118
|
+
|
|
4119
|
+
|
|
4120
|
+
|
|
4121
|
+
|
|
4122
|
+
|
|
4123
|
+
|
|
4124
|
+
|
|
4125
|
+
|
|
4126
|
+
|
|
4127
|
+
|
|
4128
|
+
|
|
4129
|
+
|
|
4130
|
+
|
|
4131
|
+
|
|
4132
|
+
|
|
4133
|
+
|
|
4134
|
+
|
|
4135
|
+
|
|
4136
|
+
|
|
4137
|
+
|
|
4138
|
+
|
|
4139
|
+
|
|
4140
|
+
|
|
4141
|
+
|
|
4142
|
+
|
|
4143
|
+
|
|
4144
|
+
|
|
4145
|
+
|
|
4146
|
+
|
|
4147
|
+
|
|
4148
|
+
|
|
4149
|
+
|
|
4150
|
+
|
|
4151
|
+
|
|
4152
|
+
|
|
4153
|
+
|
|
4154
|
+
|
|
4155
|
+
|
|
4156
|
+
|
|
4157
|
+
|
|
4158
|
+
|
|
4159
|
+
|
|
4160
|
+
|
|
4161
|
+
|
|
4162
|
+
|
|
1501
4163
|
|
|
1502
4164
|
|
|
1503
4165
|
|
|
@@ -1541,29 +4203,38 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1541
4203
|
|
|
1542
4204
|
|
|
1543
4205
|
* @example
|
|
1544
|
-
* // Find the largest key
|
|
1545
|
-
* const
|
|
1546
|
-
* [
|
|
1547
|
-
* [
|
|
1548
|
-
* [
|
|
1549
|
-
* [
|
|
4206
|
+
* // Find the largest key strictly < target
|
|
4207
|
+
* const temps = new TreeMap<number, string>([
|
|
4208
|
+
* [0, 'Freezing'],
|
|
4209
|
+
* [20, 'Cool'],
|
|
4210
|
+
* [30, 'Warm'],
|
|
4211
|
+
* [40, 'Hot']
|
|
1550
4212
|
* ]);
|
|
1551
4213
|
*
|
|
1552
|
-
* // Largest
|
|
1553
|
-
* console.log(
|
|
1554
|
-
* //
|
|
1555
|
-
* console.log(
|
|
1556
|
-
* // No version ≤ 0
|
|
1557
|
-
* console.log(versions.floor(0)); // undefined;
|
|
4214
|
+
* // Largest reading below 30
|
|
4215
|
+
* console.log(temps.lower(30)); // [20, 'Cool'];
|
|
4216
|
+
* // Nothing below 0
|
|
4217
|
+
* console.log(temps.lower(0)); // undefined;
|
|
1558
4218
|
*/
|
|
1559
|
-
|
|
4219
|
+
lower(key: K): [K, V | undefined] | undefined {
|
|
1560
4220
|
this._validateKey(key);
|
|
1561
|
-
const k = this.#core.
|
|
4221
|
+
const k = this.#core.lower(key);
|
|
1562
4222
|
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1563
4223
|
}
|
|
1564
4224
|
|
|
1565
4225
|
/**
|
|
1566
|
-
*
|
|
4226
|
+
* Return all entries in a given key range.
|
|
4227
|
+
*
|
|
4228
|
+
* @param range `[low, high]`
|
|
4229
|
+
* @param options Inclusive/exclusive bounds (defaults to inclusive).
|
|
4230
|
+
|
|
4231
|
+
|
|
4232
|
+
|
|
4233
|
+
|
|
4234
|
+
|
|
4235
|
+
|
|
4236
|
+
|
|
4237
|
+
|
|
1567
4238
|
|
|
1568
4239
|
|
|
1569
4240
|
|
|
@@ -1606,30 +4277,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1606
4277
|
|
|
1607
4278
|
|
|
1608
4279
|
|
|
1609
|
-
* @example
|
|
1610
|
-
* // Find the smallest key strictly > target
|
|
1611
|
-
* const prices = new TreeMap<number, string>([
|
|
1612
|
-
* [10, 'Basic'],
|
|
1613
|
-
* [25, 'Standard'],
|
|
1614
|
-
* [50, 'Premium'],
|
|
1615
|
-
* [100, 'Enterprise']
|
|
1616
|
-
* ]);
|
|
1617
|
-
*
|
|
1618
|
-
* // Next tier above $25
|
|
1619
|
-
* console.log(prices.higher(25)); // [50, 'Premium'];
|
|
1620
|
-
* // Next tier above $99
|
|
1621
|
-
* console.log(prices.higher(99)); // [100, 'Enterprise'];
|
|
1622
|
-
* // Nothing above $100
|
|
1623
|
-
* console.log(prices.higher(100)); // undefined;
|
|
1624
|
-
*/
|
|
1625
|
-
higher(key: K): [K, V | undefined] | undefined {
|
|
1626
|
-
this._validateKey(key);
|
|
1627
|
-
const k = this.#core.higher(key);
|
|
1628
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1629
|
-
}
|
|
1630
|
-
|
|
1631
|
-
/**
|
|
1632
|
-
* Largest entry whose key is < the given key.
|
|
1633
4280
|
|
|
1634
4281
|
|
|
1635
4282
|
|
|
@@ -1672,31 +4319,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1672
4319
|
|
|
1673
4320
|
|
|
1674
4321
|
|
|
1675
|
-
* @example
|
|
1676
|
-
* // Find the largest key strictly < target
|
|
1677
|
-
* const temps = new TreeMap<number, string>([
|
|
1678
|
-
* [0, 'Freezing'],
|
|
1679
|
-
* [20, 'Cool'],
|
|
1680
|
-
* [30, 'Warm'],
|
|
1681
|
-
* [40, 'Hot']
|
|
1682
|
-
* ]);
|
|
1683
|
-
*
|
|
1684
|
-
* // Largest reading below 30
|
|
1685
|
-
* console.log(temps.lower(30)); // [20, 'Cool'];
|
|
1686
|
-
* // Nothing below 0
|
|
1687
|
-
* console.log(temps.lower(0)); // undefined;
|
|
1688
|
-
*/
|
|
1689
|
-
lower(key: K): [K, V | undefined] | undefined {
|
|
1690
|
-
this._validateKey(key);
|
|
1691
|
-
const k = this.#core.lower(key);
|
|
1692
|
-
return k === undefined ? undefined : this._entryFromKey(k);
|
|
1693
|
-
}
|
|
1694
|
-
|
|
1695
|
-
/**
|
|
1696
|
-
* Return all entries in a given key range.
|
|
1697
|
-
*
|
|
1698
|
-
* @param range `[low, high]`
|
|
1699
|
-
* @param options Inclusive/exclusive bounds (defaults to inclusive).
|
|
1700
4322
|
|
|
1701
4323
|
|
|
1702
4324
|
|
|
@@ -1790,6 +4412,74 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1790
4412
|
return out;
|
|
1791
4413
|
}
|
|
1792
4414
|
|
|
4415
|
+
// ─── Order-Statistic Methods ───────────────────────────
|
|
4416
|
+
|
|
4417
|
+
/**
|
|
4418
|
+
* Returns the entry at the k-th position in tree order (0-indexed).
|
|
4419
|
+
* @remarks Time O(log n). Requires `enableOrderStatistic: true`.
|
|
4420
|
+
|
|
4421
|
+
|
|
4422
|
+
|
|
4423
|
+
* @example
|
|
4424
|
+
* // Find k-th entry in a TreeMap
|
|
4425
|
+
* const map = new TreeMap<string, number>(
|
|
4426
|
+
* [['alice', 95], ['bob', 87], ['charlie', 92]],
|
|
4427
|
+
* { enableOrderStatistic: true }
|
|
4428
|
+
* );
|
|
4429
|
+
* console.log(map.getByRank(0)); // 'alice';
|
|
4430
|
+
* console.log(map.getByRank(1)); // 'bob';
|
|
4431
|
+
* console.log(map.getByRank(2)); // 'charlie';
|
|
4432
|
+
*/
|
|
4433
|
+
getByRank(k: number): [K, V | undefined] | undefined {
|
|
4434
|
+
const key = this.#core.getByRank(k);
|
|
4435
|
+
if (key === undefined) return undefined;
|
|
4436
|
+
return [key, this.#core.get(key)];
|
|
4437
|
+
}
|
|
4438
|
+
|
|
4439
|
+
/**
|
|
4440
|
+
* Returns the 0-based rank of a key (number of elements that precede it in tree order).
|
|
4441
|
+
* @remarks Time O(log n). Requires `enableOrderStatistic: true`.
|
|
4442
|
+
* @example
|
|
4443
|
+
* // Get the rank of a key in sorted order
|
|
4444
|
+
* const tree = new TreeMap<number>(
|
|
4445
|
+
* [10, 20, 30, 40, 50],
|
|
4446
|
+
* { enableOrderStatistic: true }
|
|
4447
|
+
* );
|
|
4448
|
+
* console.log(tree.getRank(10)); // 0; // smallest → rank 0
|
|
4449
|
+
* console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
|
|
4450
|
+
* console.log(tree.getRank(50)); // 4; // largest → rank 4
|
|
4451
|
+
* console.log(tree.getRank(25)); // 2;
|
|
4452
|
+
*/
|
|
4453
|
+
getRank(key: K): number {
|
|
4454
|
+
return this.#core.getRank(key);
|
|
4455
|
+
}
|
|
4456
|
+
|
|
4457
|
+
/**
|
|
4458
|
+
* Returns keys by rank range (0-indexed, inclusive on both ends).
|
|
4459
|
+
* @remarks Time O(log n + k). Requires `enableOrderStatistic: true`.
|
|
4460
|
+
|
|
4461
|
+
* @example
|
|
4462
|
+
* // Pagination with rangeByRank
|
|
4463
|
+
* const tree = new TreeMap<number>(
|
|
4464
|
+
* [10, 20, 30, 40, 50, 60, 70, 80, 90],
|
|
4465
|
+
* { enableOrderStatistic: true }
|
|
4466
|
+
* );
|
|
4467
|
+
* const pageSize = 3;
|
|
4468
|
+
*
|
|
4469
|
+
* // Page 1
|
|
4470
|
+
* console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
|
|
4471
|
+
* // Page 2
|
|
4472
|
+
* console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
|
|
4473
|
+
* // Page 3
|
|
4474
|
+
* console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
|
|
4475
|
+
*/
|
|
4476
|
+
rangeByRank(start: number, end: number): Array<[K, V | undefined]> {
|
|
4477
|
+
const keys = this.#core.rangeByRank(start, end);
|
|
4478
|
+
return keys
|
|
4479
|
+
.filter((k): k is K => k !== undefined)
|
|
4480
|
+
.map(k => [k, this.#core.get(k)] as [K, V | undefined]);
|
|
4481
|
+
}
|
|
4482
|
+
|
|
1793
4483
|
/**
|
|
1794
4484
|
* Creates a shallow clone of this map.
|
|
1795
4485
|
* @remarks Time O(n log n), Space O(n)
|
|
@@ -1816,6 +4506,121 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
|
|
|
1816
4506
|
|
|
1817
4507
|
|
|
1818
4508
|
|
|
4509
|
+
|
|
4510
|
+
|
|
4511
|
+
|
|
4512
|
+
|
|
4513
|
+
|
|
4514
|
+
|
|
4515
|
+
|
|
4516
|
+
|
|
4517
|
+
|
|
4518
|
+
|
|
4519
|
+
|
|
4520
|
+
|
|
4521
|
+
|
|
4522
|
+
|
|
4523
|
+
|
|
4524
|
+
|
|
4525
|
+
|
|
4526
|
+
|
|
4527
|
+
|
|
4528
|
+
|
|
4529
|
+
|
|
4530
|
+
|
|
4531
|
+
|
|
4532
|
+
|
|
4533
|
+
|
|
4534
|
+
|
|
4535
|
+
|
|
4536
|
+
|
|
4537
|
+
|
|
4538
|
+
|
|
4539
|
+
|
|
4540
|
+
|
|
4541
|
+
|
|
4542
|
+
|
|
4543
|
+
|
|
4544
|
+
|
|
4545
|
+
|
|
4546
|
+
|
|
4547
|
+
|
|
4548
|
+
|
|
4549
|
+
|
|
4550
|
+
|
|
4551
|
+
|
|
4552
|
+
|
|
4553
|
+
|
|
4554
|
+
|
|
4555
|
+
|
|
4556
|
+
|
|
4557
|
+
|
|
4558
|
+
|
|
4559
|
+
|
|
4560
|
+
|
|
4561
|
+
|
|
4562
|
+
|
|
4563
|
+
|
|
4564
|
+
|
|
4565
|
+
|
|
4566
|
+
|
|
4567
|
+
|
|
4568
|
+
|
|
4569
|
+
|
|
4570
|
+
|
|
4571
|
+
|
|
4572
|
+
|
|
4573
|
+
|
|
4574
|
+
|
|
4575
|
+
|
|
4576
|
+
|
|
4577
|
+
|
|
4578
|
+
|
|
4579
|
+
|
|
4580
|
+
|
|
4581
|
+
|
|
4582
|
+
|
|
4583
|
+
|
|
4584
|
+
|
|
4585
|
+
|
|
4586
|
+
|
|
4587
|
+
|
|
4588
|
+
|
|
4589
|
+
|
|
4590
|
+
|
|
4591
|
+
|
|
4592
|
+
|
|
4593
|
+
|
|
4594
|
+
|
|
4595
|
+
|
|
4596
|
+
|
|
4597
|
+
|
|
4598
|
+
|
|
4599
|
+
|
|
4600
|
+
|
|
4601
|
+
|
|
4602
|
+
|
|
4603
|
+
|
|
4604
|
+
|
|
4605
|
+
|
|
4606
|
+
|
|
4607
|
+
|
|
4608
|
+
|
|
4609
|
+
|
|
4610
|
+
|
|
4611
|
+
|
|
4612
|
+
|
|
4613
|
+
|
|
4614
|
+
|
|
4615
|
+
|
|
4616
|
+
|
|
4617
|
+
|
|
4618
|
+
|
|
4619
|
+
|
|
4620
|
+
|
|
4621
|
+
|
|
4622
|
+
|
|
4623
|
+
|
|
1819
4624
|
|
|
1820
4625
|
|
|
1821
4626
|
|