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
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
import type { Comparator } from '../../types';
|
|
11
11
|
import type { TreeSetElementCallback, TreeSetOptions, TreeSetRangeOptions, TreeSetReduceCallback } from '../../types';
|
|
12
|
-
import { ERR } from '../../common';
|
|
12
|
+
import { ERR, raise } from '../../common';
|
|
13
13
|
import { RedBlackTree } from './red-black-tree';
|
|
14
14
|
|
|
15
15
|
/**
|
|
@@ -50,7 +50,7 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
50
50
|
this.#isDefaultComparator = options.comparator === undefined;
|
|
51
51
|
|
|
52
52
|
// RedBlackTree expects an iterable of keys/entries/nodes/raws; for TreeSet we only accept keys.
|
|
53
|
-
this.#core = new RedBlackTree<K, undefined>([], { comparator, isMapMode: options.isMapMode });
|
|
53
|
+
this.#core = new RedBlackTree<K, undefined>([], { comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
|
|
54
54
|
|
|
55
55
|
for (const item of elements) {
|
|
56
56
|
const k = toElementFn ? toElementFn(item as R) : item as K;
|
|
@@ -73,7 +73,7 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
73
73
|
// numbers
|
|
74
74
|
if (typeof a === 'number' && typeof b === 'number') {
|
|
75
75
|
/* istanbul ignore next -- _validateKey prevents NaN from entering the tree */
|
|
76
|
-
if (Number.isNaN(a) || Number.isNaN(b))
|
|
76
|
+
if (Number.isNaN(a) || Number.isNaN(b)) raise(TypeError, ERR.invalidNaN('TreeSet'));
|
|
77
77
|
const aa = Object.is(a, -0) ? 0 : a;
|
|
78
78
|
const bb = Object.is(b, -0) ? 0 : b;
|
|
79
79
|
return aa > bb ? 1 : aa < bb ? -1 : 0;
|
|
@@ -87,11 +87,11 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
87
87
|
const ta = a.getTime();
|
|
88
88
|
const tb = b.getTime();
|
|
89
89
|
/* istanbul ignore next -- _validateKey prevents invalid Date from entering the tree */
|
|
90
|
-
if (Number.isNaN(ta) || Number.isNaN(tb))
|
|
90
|
+
if (Number.isNaN(ta) || Number.isNaN(tb)) raise(TypeError, ERR.invalidDate('TreeSet'));
|
|
91
91
|
return ta > tb ? 1 : ta < tb ? -1 : 0;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
raise(TypeError, ERR.comparatorRequired('TreeSet'));
|
|
95
95
|
};
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -147,41 +147,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
|
|
150
|
-
* @example
|
|
151
|
-
* // Check empty
|
|
152
|
-
* console.log(new TreeSet().isEmpty()); // true;
|
|
153
|
-
*/
|
|
154
|
-
isEmpty(): boolean {
|
|
155
|
-
return this.size === 0;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
private _validateKey(key: K): void {
|
|
159
|
-
if (!this.#isDefaultComparator) return;
|
|
160
|
-
|
|
161
|
-
if (typeof key === 'number') {
|
|
162
|
-
if (Number.isNaN(key)) throw new TypeError(ERR.invalidNaN('TreeSet'));
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
if (typeof key === 'string') return;
|
|
167
|
-
|
|
168
|
-
if (key instanceof Date) {
|
|
169
|
-
if (Number.isNaN(key.getTime())) throw new TypeError(ERR.invalidDate('TreeSet'));
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
// Other key types should have provided a comparator, so reaching here means misuse.
|
|
174
|
-
throw new TypeError(ERR.comparatorRequired('TreeSet'));
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/**
|
|
178
|
-
* Add a key to the set (no-op if already present).
|
|
179
|
-
* @remarks Expected time O(log n)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
150
|
|
|
186
151
|
|
|
187
152
|
|
|
@@ -223,30 +188,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
223
188
|
|
|
224
189
|
|
|
225
190
|
|
|
226
|
-
* @example
|
|
227
|
-
* // Unique tags with sorted order
|
|
228
|
-
* const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
|
|
229
|
-
*
|
|
230
|
-
* // Duplicates removed, sorted alphabetically
|
|
231
|
-
* console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
|
|
232
|
-
* console.log(tags.size); // 4;
|
|
233
|
-
*
|
|
234
|
-
* tags.add('angular');
|
|
235
|
-
* console.log(tags.first()); // 'angular';
|
|
236
|
-
* console.log(tags.last()); // 'typescript';
|
|
237
|
-
*/
|
|
238
|
-
add(key: K): this {
|
|
239
|
-
this._validateKey(key);
|
|
240
|
-
// RBT.set returns boolean; Set.add returns this.
|
|
241
|
-
this.#core.set(key, undefined);
|
|
242
|
-
return this;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Test whether a key exists.
|
|
247
|
-
* @remarks Expected time O(log n)
|
|
248
|
-
|
|
249
|
-
|
|
250
191
|
|
|
251
192
|
|
|
252
193
|
|
|
@@ -299,22 +240,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
299
240
|
|
|
300
241
|
|
|
301
242
|
|
|
302
|
-
* @example
|
|
303
|
-
* // Checking membership in a sorted collection
|
|
304
|
-
* const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
|
|
305
|
-
*
|
|
306
|
-
* console.log(allowed.has('admin')); // true;
|
|
307
|
-
* console.log(allowed.has('guest')); // false;
|
|
308
|
-
*/
|
|
309
|
-
has(key: K): boolean {
|
|
310
|
-
this._validateKey(key);
|
|
311
|
-
return this.#core.has(key);
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Delete a key.
|
|
316
|
-
* @returns `true` if the key existed; otherwise `false`.
|
|
317
|
-
* @remarks Expected time O(log n)
|
|
318
243
|
|
|
319
244
|
|
|
320
245
|
|
|
@@ -337,6 +262,36 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
337
262
|
|
|
338
263
|
|
|
339
264
|
|
|
265
|
+
* @example
|
|
266
|
+
* // Check empty
|
|
267
|
+
* console.log(new TreeSet().isEmpty()); // true;
|
|
268
|
+
*/
|
|
269
|
+
isEmpty(): boolean {
|
|
270
|
+
return this.size === 0;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private _validateKey(key: K): void {
|
|
274
|
+
if (!this.#isDefaultComparator) return;
|
|
275
|
+
|
|
276
|
+
if (typeof key === 'number') {
|
|
277
|
+
if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeSet'));
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (typeof key === 'string') return;
|
|
282
|
+
|
|
283
|
+
if (key instanceof Date) {
|
|
284
|
+
if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeSet'));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Other key types should have provided a comparator, so reaching here means misuse.
|
|
289
|
+
raise(TypeError, ERR.comparatorRequired('TreeSet'));
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Add a key to the set (no-op if already present).
|
|
294
|
+
* @remarks Expected time O(log n)
|
|
340
295
|
|
|
341
296
|
|
|
342
297
|
|
|
@@ -369,22 +324,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
369
324
|
|
|
370
325
|
|
|
371
326
|
|
|
372
|
-
* @example
|
|
373
|
-
* // Removing elements while maintaining order
|
|
374
|
-
* const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
|
|
375
|
-
*
|
|
376
|
-
* console.log(nums.delete(5)); // true;
|
|
377
|
-
* console.log(nums.delete(5)); // false; // already gone
|
|
378
|
-
* console.log([...nums]); // [1, 3, 7, 9];
|
|
379
|
-
*/
|
|
380
|
-
delete(key: K): boolean {
|
|
381
|
-
this._validateKey(key);
|
|
382
|
-
const res = this.#core.delete(key);
|
|
383
|
-
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
/**
|
|
387
|
-
* Remove all keys.
|
|
388
327
|
|
|
389
328
|
|
|
390
329
|
|
|
@@ -428,18 +367,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
428
367
|
|
|
429
368
|
|
|
430
369
|
|
|
431
|
-
* @example
|
|
432
|
-
* // Remove all
|
|
433
|
-
* const ts = new TreeSet<number>([1, 2]);
|
|
434
|
-
* ts.clear();
|
|
435
|
-
* console.log(ts.isEmpty()); // true;
|
|
436
|
-
*/
|
|
437
|
-
clear(): void {
|
|
438
|
-
this.#core.clear();
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Iterate over keys in ascending order.
|
|
443
370
|
|
|
444
371
|
|
|
445
372
|
|
|
@@ -483,19 +410,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
483
410
|
|
|
484
411
|
|
|
485
412
|
|
|
486
|
-
* @example
|
|
487
|
-
* // Get sorted keys
|
|
488
|
-
* const ts = new TreeSet<number>([30, 10, 20]);
|
|
489
|
-
* console.log([...ts.keys()]); // [10, 20, 30];
|
|
490
|
-
*/
|
|
491
|
-
keys(): IterableIterator<K> {
|
|
492
|
-
return this.#core.keys();
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/**
|
|
496
|
-
* Iterate over values in ascending order.
|
|
497
|
-
*
|
|
498
|
-
* Note: for Set-like containers, `values()` is the same as `keys()`.
|
|
499
413
|
|
|
500
414
|
|
|
501
415
|
|
|
@@ -540,21 +454,27 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
540
454
|
|
|
541
455
|
|
|
542
456
|
* @example
|
|
543
|
-
* //
|
|
544
|
-
* const
|
|
545
|
-
*
|
|
457
|
+
* // Unique tags with sorted order
|
|
458
|
+
* const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
|
|
459
|
+
*
|
|
460
|
+
* // Duplicates removed, sorted alphabetically
|
|
461
|
+
* console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
|
|
462
|
+
* console.log(tags.size); // 4;
|
|
463
|
+
*
|
|
464
|
+
* tags.add('angular');
|
|
465
|
+
* console.log(tags.first()); // 'angular';
|
|
466
|
+
* console.log(tags.last()); // 'typescript';
|
|
546
467
|
*/
|
|
547
|
-
|
|
548
|
-
|
|
468
|
+
add(key: K): this {
|
|
469
|
+
this._validateKey(key);
|
|
470
|
+
// RBT.set returns boolean; Set.add returns this.
|
|
471
|
+
this.#core.set(key, undefined);
|
|
472
|
+
return this;
|
|
549
473
|
}
|
|
550
474
|
|
|
551
475
|
/**
|
|
552
|
-
*
|
|
553
|
-
*
|
|
554
|
-
* Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
476
|
+
* Test whether a key exists.
|
|
477
|
+
* @remarks Expected time O(log n)
|
|
558
478
|
|
|
559
479
|
|
|
560
480
|
|
|
@@ -595,23 +515,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
595
515
|
|
|
596
516
|
|
|
597
517
|
|
|
598
|
-
* @example
|
|
599
|
-
* // Iterate entries
|
|
600
|
-
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
601
|
-
* console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
|
|
602
|
-
*/
|
|
603
|
-
*entries(): IterableIterator<[K, K]> {
|
|
604
|
-
for (const k of this.keys()) yield [k, k];
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
[Symbol.iterator](): IterableIterator<K> {
|
|
608
|
-
return this.keys();
|
|
609
|
-
}
|
|
610
|
-
|
|
611
|
-
/**
|
|
612
|
-
* Visit each value in ascending order.
|
|
613
|
-
*
|
|
614
|
-
* Callback follows native Set convention: `(value, value2, set)`.
|
|
615
518
|
|
|
616
519
|
|
|
617
520
|
|
|
@@ -655,22 +558,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
655
558
|
|
|
656
559
|
|
|
657
560
|
|
|
658
|
-
* @example
|
|
659
|
-
* // Execute for each
|
|
660
|
-
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
661
|
-
* const keys: number[] = [];
|
|
662
|
-
* ts.forEach(k => keys.push(k));
|
|
663
|
-
* console.log(keys); // [1, 2, 3];
|
|
664
|
-
*/
|
|
665
|
-
forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: any): void {
|
|
666
|
-
for (const k of this) cb.call(thisArg, k, k, this);
|
|
667
|
-
}
|
|
668
|
-
|
|
669
|
-
/**
|
|
670
|
-
* Create a new TreeSet by mapping each value to a new key.
|
|
671
|
-
*
|
|
672
|
-
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
673
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
674
561
|
|
|
675
562
|
|
|
676
563
|
|
|
@@ -714,31 +601,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
714
601
|
|
|
715
602
|
|
|
716
603
|
|
|
717
|
-
* @example
|
|
718
|
-
* // Transform
|
|
719
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
720
|
-
* const doubled = ts.map(k => k * 2);
|
|
721
|
-
* console.log([...doubled]); // [2, 4, 6];
|
|
722
|
-
*/
|
|
723
|
-
map<MK>(
|
|
724
|
-
callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
|
|
725
|
-
options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
726
|
-
thisArg?: unknown
|
|
727
|
-
): TreeSet<MK> {
|
|
728
|
-
const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
|
|
729
|
-
let index = 0;
|
|
730
|
-
for (const v of this) {
|
|
731
|
-
const mk = thisArg === undefined
|
|
732
|
-
? callbackfn(v, index++, this)
|
|
733
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
|
|
734
|
-
out.add(mk);
|
|
735
|
-
}
|
|
736
|
-
return out;
|
|
737
|
-
}
|
|
738
|
-
|
|
739
|
-
/**
|
|
740
|
-
* Create a new TreeSet containing only values that satisfy the predicate.
|
|
741
|
-
* @remarks Time O(n log n) expected, Space O(n)
|
|
742
604
|
|
|
743
605
|
|
|
744
606
|
|
|
@@ -783,26 +645,24 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
783
645
|
|
|
784
646
|
|
|
785
647
|
* @example
|
|
786
|
-
* //
|
|
787
|
-
* const
|
|
788
|
-
*
|
|
789
|
-
*
|
|
648
|
+
* // Checking membership in a sorted collection
|
|
649
|
+
* const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
|
|
650
|
+
*
|
|
651
|
+
* console.log(allowed.has('admin')); // true;
|
|
652
|
+
* console.log(allowed.has('guest')); // false;
|
|
790
653
|
*/
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
for (const v of this) {
|
|
795
|
-
const ok = thisArg === undefined
|
|
796
|
-
? callbackfn(v, index++, this)
|
|
797
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
798
|
-
if (ok) out.add(v);
|
|
799
|
-
}
|
|
800
|
-
return out;
|
|
654
|
+
has(key: K): boolean {
|
|
655
|
+
this._validateKey(key);
|
|
656
|
+
return this.#core.has(key);
|
|
801
657
|
}
|
|
802
658
|
|
|
803
659
|
/**
|
|
804
|
-
*
|
|
805
|
-
* @
|
|
660
|
+
* Delete a key.
|
|
661
|
+
* @returns `true` if the key existed; otherwise `false`.
|
|
662
|
+
* @remarks Expected time O(log n)
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
|
|
806
666
|
|
|
807
667
|
|
|
808
668
|
|
|
@@ -846,22 +706,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
846
706
|
|
|
847
707
|
|
|
848
708
|
|
|
849
|
-
* @example
|
|
850
|
-
* // Aggregate
|
|
851
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
852
|
-
* const sum = ts.reduce((acc, k) => acc + k, 0);
|
|
853
|
-
* console.log(sum); // 6;
|
|
854
|
-
*/
|
|
855
|
-
reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
|
|
856
|
-
let acc = initialValue;
|
|
857
|
-
let index = 0;
|
|
858
|
-
for (const v of this) acc = callbackfn(acc, v, index++, this);
|
|
859
|
-
return acc;
|
|
860
|
-
}
|
|
861
|
-
|
|
862
|
-
/**
|
|
863
|
-
* Test whether all values satisfy a predicate.
|
|
864
|
-
* @remarks Time O(n), Space O(1)
|
|
865
709
|
|
|
866
710
|
|
|
867
711
|
|
|
@@ -903,25 +747,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
903
747
|
|
|
904
748
|
|
|
905
749
|
|
|
906
|
-
* @example
|
|
907
|
-
* // Test all
|
|
908
|
-
* const ts = new TreeSet<number>([2, 4, 6]);
|
|
909
|
-
* console.log(ts.every(k => k > 0)); // true;
|
|
910
|
-
*/
|
|
911
|
-
every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
912
|
-
let index = 0;
|
|
913
|
-
for (const v of this) {
|
|
914
|
-
const ok = thisArg === undefined
|
|
915
|
-
? callbackfn(v, index++, this)
|
|
916
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
917
|
-
if (!ok) return false;
|
|
918
|
-
}
|
|
919
|
-
return true;
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
/**
|
|
923
|
-
* Test whether any value satisfies a predicate.
|
|
924
|
-
* @remarks Time O(n), Space O(1)
|
|
925
750
|
|
|
926
751
|
|
|
927
752
|
|
|
@@ -963,25 +788,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
963
788
|
|
|
964
789
|
|
|
965
790
|
|
|
966
|
-
* @example
|
|
967
|
-
* // Test any
|
|
968
|
-
* const ts = new TreeSet<number>([1, 3, 5]);
|
|
969
|
-
* console.log(ts.some(k => k === 3)); // true;
|
|
970
|
-
*/
|
|
971
|
-
some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
972
|
-
let index = 0;
|
|
973
|
-
for (const v of this) {
|
|
974
|
-
const ok = thisArg === undefined
|
|
975
|
-
? callbackfn(v, index++, this)
|
|
976
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
977
|
-
if (ok) return true;
|
|
978
|
-
}
|
|
979
|
-
return false;
|
|
980
|
-
}
|
|
981
|
-
|
|
982
|
-
/**
|
|
983
|
-
* Find the first value that satisfies a predicate.
|
|
984
|
-
* @remarks Time O(n), Space O(1)
|
|
985
791
|
|
|
986
792
|
|
|
987
793
|
|
|
@@ -1024,25 +830,21 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1024
830
|
|
|
1025
831
|
|
|
1026
832
|
* @example
|
|
1027
|
-
* //
|
|
1028
|
-
* const
|
|
1029
|
-
*
|
|
1030
|
-
*
|
|
833
|
+
* // Removing elements while maintaining order
|
|
834
|
+
* const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
|
|
835
|
+
*
|
|
836
|
+
* console.log(nums.delete(5)); // true;
|
|
837
|
+
* console.log(nums.delete(5)); // false; // already gone
|
|
838
|
+
* console.log([...nums]); // [1, 3, 7, 9];
|
|
1031
839
|
*/
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
? callbackfn(v, index++, this)
|
|
1037
|
-
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
1038
|
-
if (ok) return v;
|
|
1039
|
-
}
|
|
1040
|
-
return undefined;
|
|
840
|
+
delete(key: K): boolean {
|
|
841
|
+
this._validateKey(key);
|
|
842
|
+
const res = this.#core.delete(key);
|
|
843
|
+
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
1041
844
|
}
|
|
1042
845
|
|
|
1043
846
|
/**
|
|
1044
|
-
*
|
|
1045
|
-
* @remarks Time O(n), Space O(n)
|
|
847
|
+
* Remove all keys.
|
|
1046
848
|
|
|
1047
849
|
|
|
1048
850
|
|
|
@@ -1086,18 +888,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1086
888
|
|
|
1087
889
|
|
|
1088
890
|
|
|
1089
|
-
* @example
|
|
1090
|
-
* // Convert to array
|
|
1091
|
-
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1092
|
-
* console.log(ts.toArray()); // [1, 2, 3];
|
|
1093
|
-
*/
|
|
1094
|
-
toArray(): K[] {
|
|
1095
|
-
return [...this];
|
|
1096
|
-
}
|
|
1097
|
-
|
|
1098
|
-
/**
|
|
1099
|
-
* Print a human-friendly representation.
|
|
1100
|
-
* @remarks Time O(n), Space O(n)
|
|
1101
891
|
|
|
1102
892
|
|
|
1103
893
|
|
|
@@ -1141,20 +931,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1141
931
|
|
|
1142
932
|
|
|
1143
933
|
|
|
1144
|
-
* @example
|
|
1145
|
-
* // Display tree
|
|
1146
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
1147
|
-
* expect(() => ts.print()).not.toThrow();
|
|
1148
|
-
*/
|
|
1149
|
-
print(): void {
|
|
1150
|
-
// Delegate to the underlying tree's visualization.
|
|
1151
|
-
this.#core.print();
|
|
1152
|
-
}
|
|
1153
|
-
|
|
1154
|
-
// Navigable operations
|
|
1155
|
-
|
|
1156
|
-
/**
|
|
1157
|
-
* Smallest key in the set.
|
|
1158
934
|
|
|
1159
935
|
|
|
1160
936
|
|
|
@@ -1167,40 +943,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1167
943
|
|
|
1168
944
|
|
|
1169
945
|
|
|
1170
|
-
* @example
|
|
1171
|
-
* // Student grade ranking with custom comparator
|
|
1172
|
-
* interface Student {
|
|
1173
|
-
* name: string;
|
|
1174
|
-
* gpa: number;
|
|
1175
|
-
* }
|
|
1176
|
-
*
|
|
1177
|
-
* const ranking = new TreeSet<Student>(
|
|
1178
|
-
* [
|
|
1179
|
-
* { name: 'Alice', gpa: 3.8 },
|
|
1180
|
-
* { name: 'Bob', gpa: 3.5 },
|
|
1181
|
-
* { name: 'Charlie', gpa: 3.9 },
|
|
1182
|
-
* { name: 'Diana', gpa: 3.5 }
|
|
1183
|
-
* ],
|
|
1184
|
-
* { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
|
|
1185
|
-
* );
|
|
1186
|
-
*
|
|
1187
|
-
* // Sorted by GPA descending, then name ascending
|
|
1188
|
-
* const names = [...ranking].map(s => s.name);
|
|
1189
|
-
* console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
|
|
1190
|
-
*
|
|
1191
|
-
* // Top student
|
|
1192
|
-
* console.log(ranking.first()?.name); // 'Charlie';
|
|
1193
|
-
*
|
|
1194
|
-
* // Filter students with GPA >= 3.8
|
|
1195
|
-
* const honors = ranking.filter(s => s.gpa >= 3.8);
|
|
1196
|
-
* console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
|
|
1197
|
-
*/
|
|
1198
|
-
first(): K | undefined {
|
|
1199
|
-
return this.#core.getLeftMost();
|
|
1200
|
-
}
|
|
1201
|
-
|
|
1202
|
-
/**
|
|
1203
|
-
* Largest key in the set.
|
|
1204
946
|
|
|
1205
947
|
|
|
1206
948
|
|
|
@@ -1213,18 +955,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1213
955
|
|
|
1214
956
|
|
|
1215
957
|
|
|
1216
|
-
* @example
|
|
1217
|
-
* // Get the maximum element
|
|
1218
|
-
* const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
|
|
1219
|
-
* console.log(temps.last()); // 30;
|
|
1220
|
-
* console.log(temps.first()); // 15;
|
|
1221
|
-
*/
|
|
1222
|
-
last(): K | undefined {
|
|
1223
|
-
return this.#core.getRightMost();
|
|
1224
|
-
}
|
|
1225
|
-
|
|
1226
|
-
/**
|
|
1227
|
-
* Remove and return the smallest key.
|
|
1228
958
|
|
|
1229
959
|
|
|
1230
960
|
|
|
@@ -1237,23 +967,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1237
967
|
|
|
1238
968
|
|
|
1239
969
|
|
|
1240
|
-
* @example
|
|
1241
|
-
* // Remove and return minimum
|
|
1242
|
-
* const queue = new TreeSet<number>([5, 1, 8, 3]);
|
|
1243
|
-
*
|
|
1244
|
-
* console.log(queue.pollFirst()); // 1;
|
|
1245
|
-
* console.log(queue.pollFirst()); // 3;
|
|
1246
|
-
* console.log(queue.size); // 2;
|
|
1247
|
-
*/
|
|
1248
|
-
pollFirst(): K | undefined {
|
|
1249
|
-
const k = this.first();
|
|
1250
|
-
if (k === undefined) return undefined;
|
|
1251
|
-
this.delete(k);
|
|
1252
|
-
return k;
|
|
1253
|
-
}
|
|
1254
|
-
|
|
1255
|
-
/**
|
|
1256
|
-
* Remove and return the largest key.
|
|
1257
970
|
|
|
1258
971
|
|
|
1259
972
|
|
|
@@ -1266,22 +979,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1266
979
|
|
|
1267
980
|
|
|
1268
981
|
|
|
1269
|
-
* @example
|
|
1270
|
-
* // Remove and return maximum
|
|
1271
|
-
* const stack = new TreeSet<number>([10, 20, 30]);
|
|
1272
|
-
*
|
|
1273
|
-
* console.log(stack.pollLast()); // 30;
|
|
1274
|
-
* console.log(stack.size); // 2;
|
|
1275
|
-
*/
|
|
1276
|
-
pollLast(): K | undefined {
|
|
1277
|
-
const k = this.last();
|
|
1278
|
-
if (k === undefined) return undefined;
|
|
1279
|
-
this.delete(k);
|
|
1280
|
-
return k;
|
|
1281
|
-
}
|
|
1282
|
-
|
|
1283
|
-
/**
|
|
1284
|
-
* Smallest key that is >= the given key.
|
|
1285
982
|
|
|
1286
983
|
|
|
1287
984
|
|
|
@@ -1306,6 +1003,18 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1306
1003
|
|
|
1307
1004
|
|
|
1308
1005
|
|
|
1006
|
+
* @example
|
|
1007
|
+
* // Remove all
|
|
1008
|
+
* const ts = new TreeSet<number>([1, 2]);
|
|
1009
|
+
* ts.clear();
|
|
1010
|
+
* console.log(ts.isEmpty()); // true;
|
|
1011
|
+
*/
|
|
1012
|
+
clear(): void {
|
|
1013
|
+
this.#core.clear();
|
|
1014
|
+
}
|
|
1015
|
+
|
|
1016
|
+
/**
|
|
1017
|
+
* Iterate over keys in ascending order.
|
|
1309
1018
|
|
|
1310
1019
|
|
|
1311
1020
|
|
|
@@ -1324,30 +1033,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1324
1033
|
|
|
1325
1034
|
|
|
1326
1035
|
|
|
1327
|
-
* @example
|
|
1328
|
-
* // Finding nearest available time slot
|
|
1329
|
-
* // Available appointment times (minutes from midnight)
|
|
1330
|
-
* const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
|
|
1331
|
-
*
|
|
1332
|
-
* // Customer wants something around 10:30 (630 min)
|
|
1333
|
-
* const nearest = slots.ceiling(630);
|
|
1334
|
-
* console.log(nearest); // 660; // 11:00 AM
|
|
1335
|
-
*
|
|
1336
|
-
* // What's the latest slot before 2:00 PM (840)?
|
|
1337
|
-
* const before2pm = slots.lower(840);
|
|
1338
|
-
* console.log(before2pm); // 720; // 12:00 PM
|
|
1339
|
-
*
|
|
1340
|
-
* // Book the 11:00 slot
|
|
1341
|
-
* slots.delete(660);
|
|
1342
|
-
* console.log(slots.ceiling(630)); // 720;
|
|
1343
|
-
*/
|
|
1344
|
-
ceiling(key: K): K | undefined {
|
|
1345
|
-
this._validateKey(key);
|
|
1346
|
-
return this.#core.ceiling(key);
|
|
1347
|
-
}
|
|
1348
|
-
|
|
1349
|
-
/**
|
|
1350
|
-
* Largest key that is <= the given key.
|
|
1351
1036
|
|
|
1352
1037
|
|
|
1353
1038
|
|
|
@@ -1390,22 +1075,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1390
1075
|
|
|
1391
1076
|
|
|
1392
1077
|
|
|
1393
|
-
* @example
|
|
1394
|
-
* // Largest element ≤ target
|
|
1395
|
-
* const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
|
|
1396
|
-
*
|
|
1397
|
-
* // Current width is 800 → which breakpoint applies?
|
|
1398
|
-
* console.log(breakpoints.floor(800)); // 768;
|
|
1399
|
-
* console.log(breakpoints.floor(1024)); // 1024; // exact match
|
|
1400
|
-
* console.log(breakpoints.floor(100)); // undefined;
|
|
1401
|
-
*/
|
|
1402
|
-
floor(key: K): K | undefined {
|
|
1403
|
-
this._validateKey(key);
|
|
1404
|
-
return this.#core.floor(key);
|
|
1405
|
-
}
|
|
1406
|
-
|
|
1407
|
-
/**
|
|
1408
|
-
* Smallest key that is > the given key.
|
|
1409
1078
|
|
|
1410
1079
|
|
|
1411
1080
|
|
|
@@ -1448,20 +1117,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1448
1117
|
|
|
1449
1118
|
|
|
1450
1119
|
|
|
1451
|
-
* @example
|
|
1452
|
-
* // Smallest element strictly > target
|
|
1453
|
-
* const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
|
|
1454
|
-
*
|
|
1455
|
-
* console.log(levels.higher(10)); // 25;
|
|
1456
|
-
* console.log(levels.higher(100)); // undefined;
|
|
1457
|
-
*/
|
|
1458
|
-
higher(key: K): K | undefined {
|
|
1459
|
-
this._validateKey(key);
|
|
1460
|
-
return this.#core.higher(key);
|
|
1461
|
-
}
|
|
1462
|
-
|
|
1463
|
-
/**
|
|
1464
|
-
* Largest key that is < the given key.
|
|
1465
1120
|
|
|
1466
1121
|
|
|
1467
1122
|
|
|
@@ -1504,12 +1159,2772 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1504
1159
|
|
|
1505
1160
|
|
|
1506
1161
|
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
* @example
|
|
1177
|
+
* // Get sorted keys
|
|
1178
|
+
* const ts = new TreeSet<number>([30, 10, 20]);
|
|
1179
|
+
* console.log([...ts.keys()]); // [10, 20, 30];
|
|
1180
|
+
*/
|
|
1181
|
+
keys(): IterableIterator<K> {
|
|
1182
|
+
return this.#core.keys();
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
/**
|
|
1186
|
+
* Iterate over values in ascending order.
|
|
1187
|
+
*
|
|
1188
|
+
* Note: for Set-like containers, `values()` is the same as `keys()`.
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
|
|
1243
|
+
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
|
|
1247
|
+
|
|
1248
|
+
|
|
1249
|
+
|
|
1250
|
+
|
|
1251
|
+
|
|
1252
|
+
|
|
1253
|
+
|
|
1254
|
+
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
|
|
1312
|
+
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
* @example
|
|
1348
|
+
* // Get values (same as keys for Set)
|
|
1349
|
+
* const ts = new TreeSet<number>([2, 1, 3]);
|
|
1350
|
+
* console.log([...ts.values()]); // [1, 2, 3];
|
|
1351
|
+
*/
|
|
1352
|
+
values(): IterableIterator<K> {
|
|
1353
|
+
return this.keys();
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1356
|
+
/**
|
|
1357
|
+
* Iterate over `[value, value]` pairs (native Set convention).
|
|
1358
|
+
*
|
|
1359
|
+
* Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
|
|
1373
|
+
|
|
1374
|
+
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
|
|
1383
|
+
|
|
1384
|
+
|
|
1385
|
+
|
|
1386
|
+
|
|
1387
|
+
|
|
1388
|
+
|
|
1389
|
+
|
|
1390
|
+
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
|
|
1397
|
+
|
|
1398
|
+
|
|
1399
|
+
|
|
1400
|
+
|
|
1401
|
+
|
|
1402
|
+
|
|
1403
|
+
|
|
1404
|
+
|
|
1405
|
+
|
|
1406
|
+
|
|
1407
|
+
|
|
1408
|
+
|
|
1409
|
+
|
|
1410
|
+
|
|
1411
|
+
|
|
1412
|
+
|
|
1413
|
+
|
|
1414
|
+
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
|
|
1419
|
+
|
|
1420
|
+
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
* @example
|
|
1519
|
+
* // Iterate entries
|
|
1520
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1521
|
+
* console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
|
|
1522
|
+
*/
|
|
1523
|
+
*entries(): IterableIterator<[K, K]> {
|
|
1524
|
+
for (const k of this.keys()) yield [k, k];
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
[Symbol.iterator](): IterableIterator<K> {
|
|
1528
|
+
return this.keys();
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
/**
|
|
1532
|
+
* Visit each value in ascending order.
|
|
1533
|
+
*
|
|
1534
|
+
* Callback follows native Set convention: `(value, value2, set)`.
|
|
1535
|
+
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
|
|
1556
|
+
|
|
1557
|
+
|
|
1558
|
+
|
|
1559
|
+
|
|
1560
|
+
|
|
1561
|
+
|
|
1562
|
+
|
|
1563
|
+
|
|
1564
|
+
|
|
1565
|
+
|
|
1566
|
+
|
|
1567
|
+
|
|
1568
|
+
|
|
1569
|
+
|
|
1570
|
+
|
|
1571
|
+
|
|
1572
|
+
|
|
1573
|
+
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
|
|
1629
|
+
|
|
1630
|
+
|
|
1631
|
+
|
|
1632
|
+
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
|
|
1639
|
+
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
|
|
1654
|
+
|
|
1655
|
+
|
|
1656
|
+
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
|
|
1660
|
+
|
|
1661
|
+
|
|
1662
|
+
|
|
1663
|
+
|
|
1664
|
+
|
|
1665
|
+
|
|
1666
|
+
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
|
|
1677
|
+
|
|
1678
|
+
|
|
1679
|
+
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
* @example
|
|
1694
|
+
* // Execute for each
|
|
1695
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1696
|
+
* const keys: number[] = [];
|
|
1697
|
+
* ts.forEach(k => keys.push(k));
|
|
1698
|
+
* console.log(keys); // [1, 2, 3];
|
|
1699
|
+
*/
|
|
1700
|
+
forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: unknown): void {
|
|
1701
|
+
for (const k of this) cb.call(thisArg, k, k, this);
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
/**
|
|
1705
|
+
* Create a new TreeSet by mapping each value to a new key.
|
|
1706
|
+
*
|
|
1707
|
+
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
1708
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
|
|
1720
|
+
|
|
1721
|
+
|
|
1722
|
+
|
|
1723
|
+
|
|
1724
|
+
|
|
1725
|
+
|
|
1726
|
+
|
|
1727
|
+
|
|
1728
|
+
|
|
1729
|
+
|
|
1730
|
+
|
|
1731
|
+
|
|
1732
|
+
|
|
1733
|
+
|
|
1734
|
+
|
|
1735
|
+
|
|
1736
|
+
|
|
1737
|
+
|
|
1738
|
+
|
|
1739
|
+
|
|
1740
|
+
|
|
1741
|
+
|
|
1742
|
+
|
|
1743
|
+
|
|
1744
|
+
|
|
1745
|
+
|
|
1746
|
+
|
|
1747
|
+
|
|
1748
|
+
|
|
1749
|
+
|
|
1750
|
+
|
|
1751
|
+
|
|
1752
|
+
|
|
1753
|
+
|
|
1754
|
+
|
|
1755
|
+
|
|
1756
|
+
|
|
1757
|
+
|
|
1758
|
+
|
|
1759
|
+
|
|
1760
|
+
|
|
1761
|
+
|
|
1762
|
+
|
|
1763
|
+
|
|
1764
|
+
|
|
1765
|
+
|
|
1766
|
+
|
|
1767
|
+
|
|
1768
|
+
|
|
1769
|
+
|
|
1770
|
+
|
|
1771
|
+
|
|
1772
|
+
|
|
1773
|
+
|
|
1774
|
+
|
|
1775
|
+
|
|
1776
|
+
|
|
1777
|
+
|
|
1778
|
+
|
|
1779
|
+
|
|
1780
|
+
|
|
1781
|
+
|
|
1782
|
+
|
|
1783
|
+
|
|
1784
|
+
|
|
1785
|
+
|
|
1786
|
+
|
|
1787
|
+
|
|
1788
|
+
|
|
1789
|
+
|
|
1790
|
+
|
|
1791
|
+
|
|
1792
|
+
|
|
1793
|
+
|
|
1794
|
+
|
|
1795
|
+
|
|
1796
|
+
|
|
1797
|
+
|
|
1798
|
+
|
|
1799
|
+
|
|
1800
|
+
|
|
1801
|
+
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
|
|
1805
|
+
|
|
1806
|
+
|
|
1807
|
+
|
|
1808
|
+
|
|
1809
|
+
|
|
1810
|
+
|
|
1811
|
+
|
|
1812
|
+
|
|
1813
|
+
|
|
1814
|
+
|
|
1815
|
+
|
|
1816
|
+
|
|
1817
|
+
|
|
1818
|
+
|
|
1819
|
+
|
|
1820
|
+
|
|
1821
|
+
|
|
1822
|
+
|
|
1823
|
+
|
|
1824
|
+
|
|
1825
|
+
|
|
1826
|
+
|
|
1827
|
+
|
|
1828
|
+
|
|
1829
|
+
|
|
1830
|
+
|
|
1831
|
+
|
|
1832
|
+
|
|
1833
|
+
|
|
1834
|
+
|
|
1835
|
+
|
|
1836
|
+
|
|
1837
|
+
|
|
1838
|
+
|
|
1839
|
+
|
|
1840
|
+
|
|
1841
|
+
|
|
1842
|
+
|
|
1843
|
+
|
|
1844
|
+
|
|
1845
|
+
|
|
1846
|
+
|
|
1847
|
+
|
|
1848
|
+
|
|
1849
|
+
|
|
1850
|
+
|
|
1851
|
+
|
|
1852
|
+
|
|
1853
|
+
|
|
1854
|
+
|
|
1855
|
+
|
|
1856
|
+
|
|
1857
|
+
|
|
1858
|
+
|
|
1859
|
+
|
|
1860
|
+
|
|
1861
|
+
|
|
1862
|
+
|
|
1863
|
+
|
|
1864
|
+
|
|
1865
|
+
|
|
1866
|
+
|
|
1867
|
+
* @example
|
|
1868
|
+
* // Transform
|
|
1869
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
1870
|
+
* const doubled = ts.map(k => k * 2);
|
|
1871
|
+
* console.log([...doubled]); // [2, 4, 6];
|
|
1872
|
+
*/
|
|
1873
|
+
map<MK>(
|
|
1874
|
+
callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
|
|
1875
|
+
options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
1876
|
+
thisArg?: unknown
|
|
1877
|
+
): TreeSet<MK> {
|
|
1878
|
+
const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
|
|
1879
|
+
let index = 0;
|
|
1880
|
+
for (const v of this) {
|
|
1881
|
+
const mk = thisArg === undefined
|
|
1882
|
+
? callbackfn(v, index++, this)
|
|
1883
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
|
|
1884
|
+
out.add(mk);
|
|
1885
|
+
}
|
|
1886
|
+
return out;
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
/**
|
|
1890
|
+
* Create a new TreeSet containing only values that satisfy the predicate.
|
|
1891
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1892
|
+
|
|
1893
|
+
|
|
1894
|
+
|
|
1895
|
+
|
|
1896
|
+
|
|
1897
|
+
|
|
1898
|
+
|
|
1899
|
+
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
|
|
1903
|
+
|
|
1904
|
+
|
|
1905
|
+
|
|
1906
|
+
|
|
1907
|
+
|
|
1908
|
+
|
|
1909
|
+
|
|
1910
|
+
|
|
1911
|
+
|
|
1912
|
+
|
|
1913
|
+
|
|
1914
|
+
|
|
1915
|
+
|
|
1916
|
+
|
|
1917
|
+
|
|
1918
|
+
|
|
1919
|
+
|
|
1920
|
+
|
|
1921
|
+
|
|
1922
|
+
|
|
1923
|
+
|
|
1924
|
+
|
|
1925
|
+
|
|
1926
|
+
|
|
1927
|
+
|
|
1928
|
+
|
|
1929
|
+
|
|
1930
|
+
|
|
1931
|
+
|
|
1932
|
+
|
|
1933
|
+
|
|
1934
|
+
|
|
1935
|
+
|
|
1936
|
+
|
|
1937
|
+
|
|
1938
|
+
|
|
1939
|
+
|
|
1940
|
+
|
|
1941
|
+
|
|
1942
|
+
|
|
1943
|
+
|
|
1944
|
+
|
|
1945
|
+
|
|
1946
|
+
|
|
1947
|
+
|
|
1948
|
+
|
|
1949
|
+
|
|
1950
|
+
|
|
1951
|
+
|
|
1952
|
+
|
|
1953
|
+
|
|
1954
|
+
|
|
1955
|
+
|
|
1956
|
+
|
|
1957
|
+
|
|
1958
|
+
|
|
1959
|
+
|
|
1960
|
+
|
|
1961
|
+
|
|
1962
|
+
|
|
1963
|
+
|
|
1964
|
+
|
|
1965
|
+
|
|
1966
|
+
|
|
1967
|
+
|
|
1968
|
+
|
|
1969
|
+
|
|
1970
|
+
|
|
1971
|
+
|
|
1972
|
+
|
|
1973
|
+
|
|
1974
|
+
|
|
1975
|
+
|
|
1976
|
+
|
|
1977
|
+
|
|
1978
|
+
|
|
1979
|
+
|
|
1980
|
+
|
|
1981
|
+
|
|
1982
|
+
|
|
1983
|
+
|
|
1984
|
+
|
|
1985
|
+
|
|
1986
|
+
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
|
|
1990
|
+
|
|
1991
|
+
|
|
1992
|
+
|
|
1993
|
+
|
|
1994
|
+
|
|
1995
|
+
|
|
1996
|
+
|
|
1997
|
+
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
|
|
2001
|
+
|
|
2002
|
+
|
|
2003
|
+
|
|
2004
|
+
|
|
2005
|
+
|
|
2006
|
+
|
|
2007
|
+
|
|
2008
|
+
|
|
2009
|
+
|
|
2010
|
+
|
|
2011
|
+
|
|
2012
|
+
|
|
2013
|
+
|
|
2014
|
+
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
|
|
2018
|
+
|
|
2019
|
+
|
|
2020
|
+
|
|
2021
|
+
|
|
2022
|
+
|
|
2023
|
+
|
|
2024
|
+
|
|
2025
|
+
|
|
2026
|
+
|
|
2027
|
+
|
|
2028
|
+
|
|
2029
|
+
|
|
2030
|
+
|
|
2031
|
+
|
|
2032
|
+
|
|
2033
|
+
|
|
2034
|
+
|
|
2035
|
+
|
|
2036
|
+
|
|
2037
|
+
|
|
2038
|
+
|
|
2039
|
+
|
|
2040
|
+
|
|
2041
|
+
|
|
2042
|
+
|
|
2043
|
+
|
|
2044
|
+
|
|
2045
|
+
|
|
2046
|
+
|
|
2047
|
+
|
|
2048
|
+
|
|
2049
|
+
|
|
2050
|
+
* @example
|
|
2051
|
+
* // Filter
|
|
2052
|
+
* const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
|
|
2053
|
+
* const evens = ts.filter(k => k % 2 === 0);
|
|
2054
|
+
* console.log([...evens]); // [2, 4];
|
|
2055
|
+
*/
|
|
2056
|
+
filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
|
|
2057
|
+
const out = new TreeSet<K>([], { comparator: this.#userComparator });
|
|
2058
|
+
let index = 0;
|
|
2059
|
+
for (const v of this) {
|
|
2060
|
+
const ok = thisArg === undefined
|
|
2061
|
+
? callbackfn(v, index++, this)
|
|
2062
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2063
|
+
if (ok) out.add(v);
|
|
2064
|
+
}
|
|
2065
|
+
return out;
|
|
2066
|
+
}
|
|
2067
|
+
|
|
2068
|
+
/**
|
|
2069
|
+
* Reduce values into a single accumulator.
|
|
2070
|
+
* @remarks Time O(n), Space O(1)
|
|
2071
|
+
|
|
2072
|
+
|
|
2073
|
+
|
|
2074
|
+
|
|
2075
|
+
|
|
2076
|
+
|
|
2077
|
+
|
|
2078
|
+
|
|
2079
|
+
|
|
2080
|
+
|
|
2081
|
+
|
|
2082
|
+
|
|
2083
|
+
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
|
|
2091
|
+
|
|
2092
|
+
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
|
|
2096
|
+
|
|
2097
|
+
|
|
2098
|
+
|
|
2099
|
+
|
|
2100
|
+
|
|
2101
|
+
|
|
2102
|
+
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
|
|
2106
|
+
|
|
2107
|
+
|
|
2108
|
+
|
|
2109
|
+
|
|
2110
|
+
|
|
2111
|
+
|
|
2112
|
+
|
|
2113
|
+
|
|
2114
|
+
|
|
2115
|
+
|
|
2116
|
+
|
|
2117
|
+
|
|
2118
|
+
|
|
2119
|
+
|
|
2120
|
+
|
|
2121
|
+
|
|
2122
|
+
|
|
2123
|
+
|
|
2124
|
+
|
|
2125
|
+
|
|
2126
|
+
|
|
2127
|
+
|
|
2128
|
+
|
|
2129
|
+
|
|
2130
|
+
|
|
2131
|
+
|
|
2132
|
+
|
|
2133
|
+
|
|
2134
|
+
|
|
2135
|
+
|
|
2136
|
+
|
|
2137
|
+
|
|
2138
|
+
|
|
2139
|
+
|
|
2140
|
+
|
|
2141
|
+
|
|
2142
|
+
|
|
2143
|
+
|
|
2144
|
+
|
|
2145
|
+
|
|
2146
|
+
|
|
2147
|
+
|
|
2148
|
+
|
|
2149
|
+
|
|
2150
|
+
|
|
2151
|
+
|
|
2152
|
+
|
|
2153
|
+
|
|
2154
|
+
|
|
2155
|
+
|
|
2156
|
+
|
|
2157
|
+
|
|
2158
|
+
|
|
2159
|
+
|
|
2160
|
+
|
|
2161
|
+
|
|
2162
|
+
|
|
2163
|
+
|
|
2164
|
+
|
|
2165
|
+
|
|
2166
|
+
|
|
2167
|
+
|
|
2168
|
+
|
|
2169
|
+
|
|
2170
|
+
|
|
2171
|
+
|
|
2172
|
+
|
|
2173
|
+
|
|
2174
|
+
|
|
2175
|
+
|
|
2176
|
+
|
|
2177
|
+
|
|
2178
|
+
|
|
2179
|
+
|
|
2180
|
+
|
|
2181
|
+
|
|
2182
|
+
|
|
2183
|
+
|
|
2184
|
+
|
|
2185
|
+
|
|
2186
|
+
|
|
2187
|
+
|
|
2188
|
+
|
|
2189
|
+
|
|
2190
|
+
|
|
2191
|
+
|
|
2192
|
+
|
|
2193
|
+
|
|
2194
|
+
|
|
2195
|
+
|
|
2196
|
+
|
|
2197
|
+
|
|
2198
|
+
|
|
2199
|
+
|
|
2200
|
+
|
|
2201
|
+
|
|
2202
|
+
|
|
2203
|
+
|
|
2204
|
+
|
|
2205
|
+
|
|
2206
|
+
|
|
2207
|
+
|
|
2208
|
+
|
|
2209
|
+
|
|
2210
|
+
|
|
2211
|
+
|
|
2212
|
+
|
|
2213
|
+
|
|
2214
|
+
|
|
2215
|
+
|
|
2216
|
+
|
|
2217
|
+
|
|
2218
|
+
|
|
2219
|
+
|
|
2220
|
+
|
|
2221
|
+
|
|
2222
|
+
|
|
2223
|
+
|
|
2224
|
+
|
|
2225
|
+
|
|
2226
|
+
|
|
2227
|
+
|
|
2228
|
+
|
|
2229
|
+
* @example
|
|
2230
|
+
* // Aggregate
|
|
2231
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2232
|
+
* const sum = ts.reduce((acc, k) => acc + k, 0);
|
|
2233
|
+
* console.log(sum); // 6;
|
|
2234
|
+
*/
|
|
2235
|
+
reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
|
|
2236
|
+
let acc = initialValue;
|
|
2237
|
+
let index = 0;
|
|
2238
|
+
for (const v of this) acc = callbackfn(acc, v, index++, this);
|
|
2239
|
+
return acc;
|
|
2240
|
+
}
|
|
2241
|
+
|
|
2242
|
+
/**
|
|
2243
|
+
* Test whether all values satisfy a predicate.
|
|
2244
|
+
* @remarks Time O(n), Space O(1)
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
|
|
2249
|
+
|
|
2250
|
+
|
|
2251
|
+
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
|
|
2255
|
+
|
|
2256
|
+
|
|
2257
|
+
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
|
|
2261
|
+
|
|
2262
|
+
|
|
2263
|
+
|
|
2264
|
+
|
|
2265
|
+
|
|
2266
|
+
|
|
2267
|
+
|
|
2268
|
+
|
|
2269
|
+
|
|
2270
|
+
|
|
2271
|
+
|
|
2272
|
+
|
|
2273
|
+
|
|
2274
|
+
|
|
2275
|
+
|
|
2276
|
+
|
|
2277
|
+
|
|
2278
|
+
|
|
2279
|
+
|
|
2280
|
+
|
|
2281
|
+
|
|
2282
|
+
|
|
2283
|
+
|
|
2284
|
+
|
|
2285
|
+
|
|
2286
|
+
|
|
2287
|
+
|
|
2288
|
+
|
|
2289
|
+
|
|
2290
|
+
|
|
2291
|
+
|
|
2292
|
+
|
|
2293
|
+
|
|
2294
|
+
|
|
2295
|
+
|
|
2296
|
+
|
|
2297
|
+
|
|
2298
|
+
|
|
2299
|
+
|
|
2300
|
+
|
|
2301
|
+
|
|
2302
|
+
|
|
2303
|
+
|
|
2304
|
+
|
|
2305
|
+
|
|
2306
|
+
|
|
2307
|
+
|
|
2308
|
+
|
|
2309
|
+
|
|
2310
|
+
|
|
2311
|
+
|
|
2312
|
+
|
|
2313
|
+
|
|
2314
|
+
|
|
2315
|
+
|
|
2316
|
+
|
|
2317
|
+
|
|
2318
|
+
|
|
2319
|
+
|
|
2320
|
+
|
|
2321
|
+
|
|
2322
|
+
|
|
2323
|
+
|
|
2324
|
+
|
|
2325
|
+
|
|
2326
|
+
|
|
2327
|
+
|
|
2328
|
+
|
|
2329
|
+
|
|
2330
|
+
|
|
2331
|
+
|
|
2332
|
+
|
|
2333
|
+
|
|
2334
|
+
|
|
2335
|
+
|
|
2336
|
+
|
|
2337
|
+
|
|
2338
|
+
|
|
2339
|
+
|
|
2340
|
+
|
|
2341
|
+
|
|
2342
|
+
|
|
2343
|
+
|
|
2344
|
+
|
|
2345
|
+
|
|
2346
|
+
|
|
2347
|
+
|
|
2348
|
+
|
|
2349
|
+
|
|
2350
|
+
|
|
2351
|
+
|
|
2352
|
+
|
|
2353
|
+
|
|
2354
|
+
|
|
2355
|
+
|
|
2356
|
+
|
|
2357
|
+
|
|
2358
|
+
|
|
2359
|
+
|
|
2360
|
+
|
|
2361
|
+
|
|
2362
|
+
|
|
2363
|
+
|
|
2364
|
+
|
|
2365
|
+
|
|
2366
|
+
|
|
2367
|
+
|
|
2368
|
+
|
|
2369
|
+
|
|
2370
|
+
|
|
2371
|
+
|
|
2372
|
+
|
|
2373
|
+
|
|
2374
|
+
|
|
2375
|
+
|
|
2376
|
+
|
|
2377
|
+
|
|
2378
|
+
|
|
2379
|
+
|
|
2380
|
+
|
|
2381
|
+
|
|
2382
|
+
|
|
2383
|
+
|
|
2384
|
+
|
|
2385
|
+
|
|
2386
|
+
|
|
2387
|
+
|
|
2388
|
+
|
|
2389
|
+
|
|
2390
|
+
|
|
2391
|
+
|
|
2392
|
+
|
|
2393
|
+
|
|
2394
|
+
|
|
2395
|
+
|
|
2396
|
+
|
|
2397
|
+
|
|
2398
|
+
|
|
2399
|
+
|
|
2400
|
+
|
|
2401
|
+
* @example
|
|
2402
|
+
* // Test all
|
|
2403
|
+
* const ts = new TreeSet<number>([2, 4, 6]);
|
|
2404
|
+
* console.log(ts.every(k => k > 0)); // true;
|
|
2405
|
+
*/
|
|
2406
|
+
every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
2407
|
+
let index = 0;
|
|
2408
|
+
for (const v of this) {
|
|
2409
|
+
const ok = thisArg === undefined
|
|
2410
|
+
? callbackfn(v, index++, this)
|
|
2411
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2412
|
+
if (!ok) return false;
|
|
2413
|
+
}
|
|
2414
|
+
return true;
|
|
2415
|
+
}
|
|
2416
|
+
|
|
2417
|
+
/**
|
|
2418
|
+
* Test whether any value satisfies a predicate.
|
|
2419
|
+
* @remarks Time O(n), Space O(1)
|
|
2420
|
+
|
|
2421
|
+
|
|
2422
|
+
|
|
2423
|
+
|
|
2424
|
+
|
|
2425
|
+
|
|
2426
|
+
|
|
2427
|
+
|
|
2428
|
+
|
|
2429
|
+
|
|
2430
|
+
|
|
2431
|
+
|
|
2432
|
+
|
|
2433
|
+
|
|
2434
|
+
|
|
2435
|
+
|
|
2436
|
+
|
|
2437
|
+
|
|
2438
|
+
|
|
2439
|
+
|
|
2440
|
+
|
|
2441
|
+
|
|
2442
|
+
|
|
2443
|
+
|
|
2444
|
+
|
|
2445
|
+
|
|
2446
|
+
|
|
2447
|
+
|
|
2448
|
+
|
|
2449
|
+
|
|
2450
|
+
|
|
2451
|
+
|
|
2452
|
+
|
|
2453
|
+
|
|
2454
|
+
|
|
2455
|
+
|
|
2456
|
+
|
|
2457
|
+
|
|
2458
|
+
|
|
2459
|
+
|
|
2460
|
+
|
|
2461
|
+
|
|
2462
|
+
|
|
2463
|
+
|
|
2464
|
+
|
|
2465
|
+
|
|
2466
|
+
|
|
2467
|
+
|
|
2468
|
+
|
|
2469
|
+
|
|
2470
|
+
|
|
2471
|
+
|
|
2472
|
+
|
|
2473
|
+
|
|
2474
|
+
|
|
2475
|
+
|
|
2476
|
+
|
|
2477
|
+
|
|
2478
|
+
|
|
2479
|
+
|
|
2480
|
+
|
|
2481
|
+
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
|
|
2485
|
+
|
|
2486
|
+
|
|
2487
|
+
|
|
2488
|
+
|
|
2489
|
+
|
|
2490
|
+
|
|
2491
|
+
|
|
2492
|
+
|
|
2493
|
+
|
|
2494
|
+
|
|
2495
|
+
|
|
2496
|
+
|
|
2497
|
+
|
|
2498
|
+
|
|
2499
|
+
|
|
2500
|
+
|
|
2501
|
+
|
|
2502
|
+
|
|
2503
|
+
|
|
2504
|
+
|
|
2505
|
+
|
|
2506
|
+
|
|
2507
|
+
|
|
2508
|
+
|
|
2509
|
+
|
|
2510
|
+
|
|
2511
|
+
|
|
2512
|
+
|
|
2513
|
+
|
|
2514
|
+
|
|
2515
|
+
|
|
2516
|
+
|
|
2517
|
+
|
|
2518
|
+
|
|
2519
|
+
|
|
2520
|
+
|
|
2521
|
+
|
|
2522
|
+
|
|
2523
|
+
|
|
2524
|
+
|
|
2525
|
+
|
|
2526
|
+
|
|
2527
|
+
|
|
2528
|
+
|
|
2529
|
+
|
|
2530
|
+
|
|
2531
|
+
|
|
2532
|
+
|
|
2533
|
+
|
|
2534
|
+
|
|
2535
|
+
|
|
2536
|
+
|
|
2537
|
+
|
|
2538
|
+
|
|
2539
|
+
|
|
2540
|
+
|
|
2541
|
+
|
|
2542
|
+
|
|
2543
|
+
|
|
2544
|
+
|
|
2545
|
+
|
|
2546
|
+
|
|
2547
|
+
|
|
2548
|
+
|
|
2549
|
+
|
|
2550
|
+
|
|
2551
|
+
|
|
2552
|
+
|
|
2553
|
+
|
|
2554
|
+
|
|
2555
|
+
|
|
2556
|
+
|
|
2557
|
+
|
|
2558
|
+
|
|
2559
|
+
|
|
2560
|
+
|
|
2561
|
+
|
|
2562
|
+
|
|
2563
|
+
|
|
2564
|
+
|
|
2565
|
+
|
|
2566
|
+
|
|
2567
|
+
|
|
2568
|
+
|
|
2569
|
+
|
|
2570
|
+
|
|
2571
|
+
|
|
2572
|
+
|
|
2573
|
+
|
|
2574
|
+
|
|
2575
|
+
|
|
2576
|
+
* @example
|
|
2577
|
+
* // Test any
|
|
2578
|
+
* const ts = new TreeSet<number>([1, 3, 5]);
|
|
2579
|
+
* console.log(ts.some(k => k === 3)); // true;
|
|
2580
|
+
*/
|
|
2581
|
+
some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
2582
|
+
let index = 0;
|
|
2583
|
+
for (const v of this) {
|
|
2584
|
+
const ok = thisArg === undefined
|
|
2585
|
+
? callbackfn(v, index++, this)
|
|
2586
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2587
|
+
if (ok) return true;
|
|
2588
|
+
}
|
|
2589
|
+
return false;
|
|
2590
|
+
}
|
|
2591
|
+
|
|
2592
|
+
/**
|
|
2593
|
+
* Find the first value that satisfies a predicate.
|
|
2594
|
+
* @remarks Time O(n), Space O(1)
|
|
2595
|
+
|
|
2596
|
+
|
|
2597
|
+
|
|
2598
|
+
|
|
2599
|
+
|
|
2600
|
+
|
|
2601
|
+
|
|
2602
|
+
|
|
2603
|
+
|
|
2604
|
+
|
|
2605
|
+
|
|
2606
|
+
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
|
|
2610
|
+
|
|
2611
|
+
|
|
2612
|
+
|
|
2613
|
+
|
|
2614
|
+
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
|
|
2618
|
+
|
|
2619
|
+
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
|
|
2623
|
+
|
|
2624
|
+
|
|
2625
|
+
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
|
|
2629
|
+
|
|
2630
|
+
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
|
|
2634
|
+
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
|
|
2638
|
+
|
|
2639
|
+
|
|
2640
|
+
|
|
2641
|
+
|
|
2642
|
+
|
|
2643
|
+
|
|
2644
|
+
|
|
2645
|
+
|
|
2646
|
+
|
|
2647
|
+
|
|
2648
|
+
|
|
2649
|
+
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
|
|
2656
|
+
|
|
2657
|
+
|
|
2658
|
+
|
|
2659
|
+
|
|
2660
|
+
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
|
|
2668
|
+
|
|
2669
|
+
|
|
2670
|
+
|
|
2671
|
+
|
|
2672
|
+
|
|
2673
|
+
|
|
2674
|
+
|
|
2675
|
+
|
|
2676
|
+
|
|
2677
|
+
|
|
2678
|
+
|
|
2679
|
+
|
|
2680
|
+
|
|
2681
|
+
|
|
2682
|
+
|
|
2683
|
+
|
|
2684
|
+
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
|
|
2690
|
+
|
|
2691
|
+
|
|
2692
|
+
|
|
2693
|
+
|
|
2694
|
+
|
|
2695
|
+
|
|
2696
|
+
|
|
2697
|
+
|
|
2698
|
+
|
|
2699
|
+
|
|
2700
|
+
|
|
2701
|
+
|
|
2702
|
+
|
|
2703
|
+
|
|
2704
|
+
|
|
2705
|
+
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
|
|
2722
|
+
|
|
2723
|
+
|
|
2724
|
+
|
|
2725
|
+
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
|
|
2738
|
+
|
|
2739
|
+
|
|
2740
|
+
|
|
2741
|
+
|
|
2742
|
+
|
|
2743
|
+
|
|
2744
|
+
|
|
2745
|
+
|
|
2746
|
+
|
|
2747
|
+
|
|
2748
|
+
|
|
2749
|
+
|
|
2750
|
+
|
|
2751
|
+
* @example
|
|
2752
|
+
* // Find entry
|
|
2753
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2754
|
+
* const found = ts.find(k => k === 2);
|
|
2755
|
+
* console.log(found); // 2;
|
|
2756
|
+
*/
|
|
2757
|
+
find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
|
|
2758
|
+
let index = 0;
|
|
2759
|
+
for (const v of this) {
|
|
2760
|
+
const ok = thisArg === undefined
|
|
2761
|
+
? callbackfn(v, index++, this)
|
|
2762
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2763
|
+
if (ok) return v;
|
|
2764
|
+
}
|
|
2765
|
+
return undefined;
|
|
2766
|
+
}
|
|
2767
|
+
|
|
2768
|
+
/**
|
|
2769
|
+
* Materialize the set into an array of keys.
|
|
2770
|
+
* @remarks Time O(n), Space O(n)
|
|
2771
|
+
|
|
2772
|
+
|
|
2773
|
+
|
|
2774
|
+
|
|
2775
|
+
|
|
2776
|
+
|
|
2777
|
+
|
|
2778
|
+
|
|
2779
|
+
|
|
2780
|
+
|
|
2781
|
+
|
|
2782
|
+
|
|
2783
|
+
|
|
2784
|
+
|
|
2785
|
+
|
|
2786
|
+
|
|
2787
|
+
|
|
2788
|
+
|
|
2789
|
+
|
|
2790
|
+
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
|
|
2800
|
+
|
|
2801
|
+
|
|
2802
|
+
|
|
2803
|
+
|
|
2804
|
+
|
|
2805
|
+
|
|
2806
|
+
|
|
2807
|
+
|
|
2808
|
+
|
|
2809
|
+
|
|
2810
|
+
|
|
2811
|
+
|
|
2812
|
+
|
|
2813
|
+
|
|
2814
|
+
|
|
2815
|
+
|
|
2816
|
+
|
|
2817
|
+
|
|
2818
|
+
|
|
2819
|
+
|
|
2820
|
+
|
|
2821
|
+
|
|
2822
|
+
|
|
2823
|
+
|
|
2824
|
+
|
|
2825
|
+
|
|
2826
|
+
|
|
2827
|
+
|
|
2828
|
+
|
|
2829
|
+
|
|
2830
|
+
|
|
2831
|
+
|
|
2832
|
+
|
|
2833
|
+
|
|
2834
|
+
|
|
2835
|
+
|
|
2836
|
+
|
|
2837
|
+
|
|
2838
|
+
|
|
2839
|
+
|
|
2840
|
+
|
|
2841
|
+
|
|
2842
|
+
|
|
2843
|
+
|
|
2844
|
+
|
|
2845
|
+
|
|
2846
|
+
|
|
2847
|
+
|
|
2848
|
+
|
|
2849
|
+
|
|
2850
|
+
|
|
2851
|
+
|
|
2852
|
+
|
|
2853
|
+
|
|
2854
|
+
|
|
2855
|
+
|
|
2856
|
+
|
|
2857
|
+
|
|
2858
|
+
|
|
2859
|
+
|
|
2860
|
+
|
|
2861
|
+
|
|
2862
|
+
|
|
2863
|
+
|
|
2864
|
+
|
|
2865
|
+
|
|
2866
|
+
|
|
2867
|
+
|
|
2868
|
+
|
|
2869
|
+
|
|
2870
|
+
|
|
2871
|
+
|
|
2872
|
+
|
|
2873
|
+
|
|
2874
|
+
|
|
2875
|
+
|
|
2876
|
+
|
|
2877
|
+
|
|
2878
|
+
|
|
2879
|
+
|
|
2880
|
+
|
|
2881
|
+
|
|
2882
|
+
|
|
2883
|
+
|
|
2884
|
+
|
|
2885
|
+
|
|
2886
|
+
|
|
2887
|
+
|
|
2888
|
+
|
|
2889
|
+
|
|
2890
|
+
|
|
2891
|
+
|
|
2892
|
+
|
|
2893
|
+
|
|
2894
|
+
|
|
2895
|
+
|
|
2896
|
+
|
|
2897
|
+
|
|
2898
|
+
|
|
2899
|
+
|
|
2900
|
+
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
|
|
2904
|
+
|
|
2905
|
+
|
|
2906
|
+
|
|
2907
|
+
|
|
2908
|
+
|
|
2909
|
+
|
|
2910
|
+
|
|
2911
|
+
|
|
2912
|
+
|
|
2913
|
+
|
|
2914
|
+
|
|
2915
|
+
|
|
2916
|
+
|
|
2917
|
+
|
|
2918
|
+
|
|
2919
|
+
|
|
2920
|
+
|
|
2921
|
+
|
|
2922
|
+
|
|
2923
|
+
|
|
2924
|
+
|
|
2925
|
+
|
|
2926
|
+
|
|
2927
|
+
|
|
2928
|
+
|
|
2929
|
+
* @example
|
|
2930
|
+
* // Convert to array
|
|
2931
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
2932
|
+
* console.log(ts.toArray()); // [1, 2, 3];
|
|
2933
|
+
*/
|
|
2934
|
+
toArray(): K[] {
|
|
2935
|
+
return [...this];
|
|
2936
|
+
}
|
|
2937
|
+
|
|
2938
|
+
/**
|
|
2939
|
+
* Print a human-friendly representation.
|
|
2940
|
+
* @remarks Time O(n), Space O(n)
|
|
2941
|
+
|
|
2942
|
+
|
|
2943
|
+
|
|
2944
|
+
|
|
2945
|
+
|
|
2946
|
+
|
|
2947
|
+
|
|
2948
|
+
|
|
2949
|
+
|
|
2950
|
+
|
|
2951
|
+
|
|
2952
|
+
|
|
2953
|
+
|
|
2954
|
+
|
|
2955
|
+
|
|
2956
|
+
|
|
2957
|
+
|
|
2958
|
+
|
|
2959
|
+
|
|
2960
|
+
|
|
2961
|
+
|
|
2962
|
+
|
|
2963
|
+
|
|
2964
|
+
|
|
2965
|
+
|
|
2966
|
+
|
|
2967
|
+
|
|
2968
|
+
|
|
2969
|
+
|
|
2970
|
+
|
|
2971
|
+
|
|
2972
|
+
|
|
2973
|
+
|
|
2974
|
+
|
|
2975
|
+
|
|
2976
|
+
|
|
2977
|
+
|
|
2978
|
+
|
|
2979
|
+
|
|
2980
|
+
|
|
2981
|
+
|
|
2982
|
+
|
|
2983
|
+
|
|
2984
|
+
|
|
2985
|
+
|
|
2986
|
+
|
|
2987
|
+
|
|
2988
|
+
|
|
2989
|
+
|
|
2990
|
+
|
|
2991
|
+
|
|
2992
|
+
|
|
2993
|
+
|
|
2994
|
+
|
|
2995
|
+
|
|
2996
|
+
|
|
2997
|
+
|
|
2998
|
+
|
|
2999
|
+
|
|
3000
|
+
|
|
3001
|
+
|
|
3002
|
+
|
|
3003
|
+
|
|
3004
|
+
|
|
3005
|
+
|
|
3006
|
+
|
|
3007
|
+
|
|
3008
|
+
|
|
3009
|
+
|
|
3010
|
+
|
|
3011
|
+
|
|
3012
|
+
|
|
3013
|
+
|
|
3014
|
+
|
|
3015
|
+
|
|
3016
|
+
|
|
3017
|
+
|
|
3018
|
+
|
|
3019
|
+
|
|
3020
|
+
|
|
3021
|
+
|
|
3022
|
+
|
|
3023
|
+
|
|
3024
|
+
|
|
3025
|
+
|
|
3026
|
+
|
|
3027
|
+
|
|
3028
|
+
|
|
3029
|
+
|
|
3030
|
+
|
|
3031
|
+
|
|
3032
|
+
|
|
3033
|
+
|
|
3034
|
+
|
|
3035
|
+
|
|
3036
|
+
|
|
3037
|
+
|
|
3038
|
+
|
|
3039
|
+
|
|
3040
|
+
|
|
3041
|
+
|
|
3042
|
+
|
|
3043
|
+
|
|
3044
|
+
|
|
3045
|
+
|
|
3046
|
+
|
|
3047
|
+
|
|
3048
|
+
|
|
3049
|
+
|
|
3050
|
+
|
|
3051
|
+
|
|
3052
|
+
|
|
3053
|
+
|
|
3054
|
+
|
|
3055
|
+
|
|
3056
|
+
|
|
3057
|
+
|
|
3058
|
+
|
|
3059
|
+
|
|
3060
|
+
|
|
3061
|
+
|
|
3062
|
+
|
|
3063
|
+
|
|
3064
|
+
|
|
3065
|
+
|
|
3066
|
+
|
|
3067
|
+
|
|
3068
|
+
|
|
3069
|
+
|
|
3070
|
+
|
|
3071
|
+
|
|
3072
|
+
|
|
3073
|
+
|
|
3074
|
+
|
|
3075
|
+
|
|
3076
|
+
|
|
3077
|
+
|
|
3078
|
+
|
|
3079
|
+
|
|
3080
|
+
|
|
3081
|
+
|
|
3082
|
+
|
|
3083
|
+
|
|
3084
|
+
|
|
3085
|
+
|
|
3086
|
+
|
|
3087
|
+
|
|
3088
|
+
|
|
3089
|
+
|
|
3090
|
+
|
|
3091
|
+
|
|
3092
|
+
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
|
|
3096
|
+
|
|
3097
|
+
|
|
3098
|
+
|
|
3099
|
+
* @example
|
|
3100
|
+
* // Display tree
|
|
3101
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
3102
|
+
* expect(() => ts.print()).not.toThrow();
|
|
3103
|
+
*/
|
|
3104
|
+
print(): void {
|
|
3105
|
+
// Delegate to the underlying tree's visualization.
|
|
3106
|
+
this.#core.print();
|
|
3107
|
+
}
|
|
3108
|
+
|
|
3109
|
+
// Navigable operations
|
|
3110
|
+
|
|
3111
|
+
/**
|
|
3112
|
+
* Smallest key in the set.
|
|
3113
|
+
|
|
3114
|
+
|
|
3115
|
+
|
|
3116
|
+
|
|
3117
|
+
|
|
3118
|
+
|
|
3119
|
+
|
|
3120
|
+
|
|
3121
|
+
|
|
3122
|
+
|
|
3123
|
+
|
|
3124
|
+
|
|
3125
|
+
|
|
3126
|
+
|
|
3127
|
+
|
|
3128
|
+
|
|
3129
|
+
|
|
3130
|
+
|
|
3131
|
+
|
|
3132
|
+
|
|
3133
|
+
|
|
3134
|
+
|
|
3135
|
+
|
|
3136
|
+
|
|
3137
|
+
|
|
3138
|
+
|
|
3139
|
+
|
|
3140
|
+
|
|
3141
|
+
|
|
3142
|
+
|
|
3143
|
+
|
|
3144
|
+
|
|
3145
|
+
|
|
3146
|
+
|
|
3147
|
+
|
|
3148
|
+
* @example
|
|
3149
|
+
* // Student grade ranking with custom comparator
|
|
3150
|
+
* interface Student {
|
|
3151
|
+
* name: string;
|
|
3152
|
+
* gpa: number;
|
|
3153
|
+
* }
|
|
3154
|
+
*
|
|
3155
|
+
* const ranking = new TreeSet<Student>(
|
|
3156
|
+
* [
|
|
3157
|
+
* { name: 'Alice', gpa: 3.8 },
|
|
3158
|
+
* { name: 'Bob', gpa: 3.5 },
|
|
3159
|
+
* { name: 'Charlie', gpa: 3.9 },
|
|
3160
|
+
* { name: 'Diana', gpa: 3.5 }
|
|
3161
|
+
* ],
|
|
3162
|
+
* { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
|
|
3163
|
+
* );
|
|
3164
|
+
*
|
|
3165
|
+
* // Sorted by GPA descending, then name ascending
|
|
3166
|
+
* const names = [...ranking].map(s => s.name);
|
|
3167
|
+
* console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
|
|
3168
|
+
*
|
|
3169
|
+
* // Top student
|
|
3170
|
+
* console.log(ranking.first()?.name); // 'Charlie';
|
|
3171
|
+
*
|
|
3172
|
+
* // Filter students with GPA >= 3.8
|
|
3173
|
+
* const honors = ranking.filter(s => s.gpa >= 3.8);
|
|
3174
|
+
* console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
|
|
3175
|
+
*/
|
|
3176
|
+
first(): K | undefined {
|
|
3177
|
+
return this.#core.getLeftMost();
|
|
3178
|
+
}
|
|
3179
|
+
|
|
3180
|
+
/**
|
|
3181
|
+
* Largest key in the set.
|
|
3182
|
+
|
|
3183
|
+
|
|
3184
|
+
|
|
3185
|
+
|
|
3186
|
+
|
|
3187
|
+
|
|
3188
|
+
|
|
3189
|
+
|
|
3190
|
+
|
|
3191
|
+
|
|
3192
|
+
|
|
3193
|
+
|
|
3194
|
+
|
|
3195
|
+
|
|
3196
|
+
|
|
3197
|
+
|
|
3198
|
+
|
|
3199
|
+
|
|
3200
|
+
|
|
3201
|
+
|
|
3202
|
+
|
|
3203
|
+
|
|
3204
|
+
|
|
3205
|
+
|
|
3206
|
+
|
|
3207
|
+
|
|
3208
|
+
|
|
3209
|
+
|
|
3210
|
+
|
|
3211
|
+
|
|
3212
|
+
|
|
3213
|
+
|
|
3214
|
+
|
|
3215
|
+
|
|
3216
|
+
|
|
3217
|
+
* @example
|
|
3218
|
+
* // Get the maximum element
|
|
3219
|
+
* const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
|
|
3220
|
+
* console.log(temps.last()); // 30;
|
|
3221
|
+
* console.log(temps.first()); // 15;
|
|
3222
|
+
*/
|
|
3223
|
+
last(): K | undefined {
|
|
3224
|
+
return this.#core.getRightMost();
|
|
3225
|
+
}
|
|
3226
|
+
|
|
3227
|
+
/**
|
|
3228
|
+
* Remove and return the smallest key.
|
|
3229
|
+
|
|
3230
|
+
|
|
3231
|
+
|
|
3232
|
+
|
|
3233
|
+
|
|
3234
|
+
|
|
3235
|
+
|
|
3236
|
+
|
|
3237
|
+
|
|
3238
|
+
|
|
3239
|
+
|
|
3240
|
+
|
|
3241
|
+
|
|
3242
|
+
|
|
3243
|
+
|
|
3244
|
+
|
|
3245
|
+
|
|
3246
|
+
|
|
3247
|
+
|
|
3248
|
+
|
|
3249
|
+
|
|
3250
|
+
|
|
3251
|
+
|
|
3252
|
+
|
|
3253
|
+
|
|
3254
|
+
|
|
3255
|
+
|
|
3256
|
+
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
|
|
3260
|
+
|
|
3261
|
+
|
|
3262
|
+
|
|
3263
|
+
|
|
3264
|
+
* @example
|
|
3265
|
+
* // Remove and return minimum
|
|
3266
|
+
* const queue = new TreeSet<number>([5, 1, 8, 3]);
|
|
3267
|
+
*
|
|
3268
|
+
* console.log(queue.pollFirst()); // 1;
|
|
3269
|
+
* console.log(queue.pollFirst()); // 3;
|
|
3270
|
+
* console.log(queue.size); // 2;
|
|
3271
|
+
*/
|
|
3272
|
+
pollFirst(): K | undefined {
|
|
3273
|
+
const k = this.first();
|
|
3274
|
+
if (k === undefined) return undefined;
|
|
3275
|
+
this.delete(k);
|
|
3276
|
+
return k;
|
|
3277
|
+
}
|
|
3278
|
+
|
|
3279
|
+
/**
|
|
3280
|
+
* Remove and return the largest key.
|
|
3281
|
+
|
|
3282
|
+
|
|
3283
|
+
|
|
3284
|
+
|
|
3285
|
+
|
|
3286
|
+
|
|
3287
|
+
|
|
3288
|
+
|
|
3289
|
+
|
|
3290
|
+
|
|
3291
|
+
|
|
3292
|
+
|
|
3293
|
+
|
|
3294
|
+
|
|
3295
|
+
|
|
3296
|
+
|
|
3297
|
+
|
|
3298
|
+
|
|
3299
|
+
|
|
3300
|
+
|
|
3301
|
+
|
|
3302
|
+
|
|
3303
|
+
|
|
3304
|
+
|
|
3305
|
+
|
|
3306
|
+
|
|
3307
|
+
|
|
3308
|
+
|
|
3309
|
+
|
|
3310
|
+
|
|
3311
|
+
|
|
3312
|
+
|
|
3313
|
+
|
|
3314
|
+
|
|
3315
|
+
|
|
3316
|
+
* @example
|
|
3317
|
+
* // Remove and return maximum
|
|
3318
|
+
* const stack = new TreeSet<number>([10, 20, 30]);
|
|
3319
|
+
*
|
|
3320
|
+
* console.log(stack.pollLast()); // 30;
|
|
3321
|
+
* console.log(stack.size); // 2;
|
|
3322
|
+
*/
|
|
3323
|
+
pollLast(): K | undefined {
|
|
3324
|
+
const k = this.last();
|
|
3325
|
+
if (k === undefined) return undefined;
|
|
3326
|
+
this.delete(k);
|
|
3327
|
+
return k;
|
|
3328
|
+
}
|
|
3329
|
+
|
|
3330
|
+
/**
|
|
3331
|
+
* Smallest key that is >= the given key.
|
|
3332
|
+
|
|
3333
|
+
|
|
3334
|
+
|
|
3335
|
+
|
|
3336
|
+
|
|
3337
|
+
|
|
3338
|
+
|
|
3339
|
+
|
|
3340
|
+
|
|
3341
|
+
|
|
3342
|
+
|
|
3343
|
+
|
|
3344
|
+
|
|
3345
|
+
|
|
3346
|
+
|
|
3347
|
+
|
|
3348
|
+
|
|
3349
|
+
|
|
3350
|
+
|
|
3351
|
+
|
|
3352
|
+
|
|
3353
|
+
|
|
3354
|
+
|
|
3355
|
+
|
|
3356
|
+
|
|
3357
|
+
|
|
3358
|
+
|
|
3359
|
+
|
|
3360
|
+
|
|
3361
|
+
|
|
3362
|
+
|
|
3363
|
+
|
|
3364
|
+
|
|
3365
|
+
|
|
3366
|
+
|
|
3367
|
+
|
|
3368
|
+
|
|
3369
|
+
|
|
3370
|
+
|
|
3371
|
+
|
|
3372
|
+
|
|
3373
|
+
|
|
3374
|
+
|
|
3375
|
+
|
|
3376
|
+
|
|
3377
|
+
|
|
3378
|
+
|
|
3379
|
+
|
|
3380
|
+
|
|
3381
|
+
|
|
3382
|
+
|
|
3383
|
+
|
|
3384
|
+
|
|
3385
|
+
|
|
3386
|
+
|
|
3387
|
+
|
|
3388
|
+
|
|
3389
|
+
|
|
3390
|
+
|
|
3391
|
+
|
|
3392
|
+
|
|
3393
|
+
|
|
3394
|
+
|
|
3395
|
+
|
|
3396
|
+
|
|
3397
|
+
|
|
3398
|
+
|
|
3399
|
+
|
|
3400
|
+
|
|
3401
|
+
|
|
3402
|
+
|
|
3403
|
+
|
|
3404
|
+
|
|
3405
|
+
|
|
3406
|
+
|
|
3407
|
+
|
|
3408
|
+
|
|
3409
|
+
|
|
3410
|
+
|
|
3411
|
+
|
|
3412
|
+
|
|
3413
|
+
|
|
3414
|
+
|
|
3415
|
+
|
|
3416
|
+
|
|
3417
|
+
|
|
3418
|
+
|
|
3419
|
+
|
|
3420
|
+
|
|
3421
|
+
|
|
3422
|
+
|
|
3423
|
+
|
|
3424
|
+
|
|
3425
|
+
|
|
3426
|
+
|
|
3427
|
+
|
|
3428
|
+
|
|
3429
|
+
|
|
3430
|
+
|
|
3431
|
+
|
|
3432
|
+
|
|
3433
|
+
|
|
3434
|
+
|
|
3435
|
+
|
|
3436
|
+
|
|
3437
|
+
|
|
3438
|
+
|
|
3439
|
+
|
|
3440
|
+
|
|
3441
|
+
|
|
3442
|
+
|
|
3443
|
+
|
|
3444
|
+
|
|
3445
|
+
|
|
3446
|
+
|
|
3447
|
+
|
|
3448
|
+
|
|
3449
|
+
|
|
3450
|
+
|
|
3451
|
+
|
|
3452
|
+
|
|
3453
|
+
|
|
3454
|
+
|
|
3455
|
+
|
|
3456
|
+
|
|
3457
|
+
|
|
3458
|
+
|
|
3459
|
+
|
|
3460
|
+
|
|
3461
|
+
|
|
3462
|
+
|
|
3463
|
+
|
|
3464
|
+
|
|
3465
|
+
|
|
3466
|
+
* @example
|
|
3467
|
+
* // Finding nearest available time slot
|
|
3468
|
+
* // Available appointment times (minutes from midnight)
|
|
3469
|
+
* const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
|
|
3470
|
+
*
|
|
3471
|
+
* // Customer wants something around 10:30 (630 min)
|
|
3472
|
+
* const nearest = slots.ceiling(630);
|
|
3473
|
+
* console.log(nearest); // 660; // 11:00 AM
|
|
3474
|
+
*
|
|
3475
|
+
* // What's the latest slot before 2:00 PM (840)?
|
|
3476
|
+
* const before2pm = slots.lower(840);
|
|
3477
|
+
* console.log(before2pm); // 720; // 12:00 PM
|
|
3478
|
+
*
|
|
3479
|
+
* // Book the 11:00 slot
|
|
3480
|
+
* slots.delete(660);
|
|
3481
|
+
* console.log(slots.ceiling(630)); // 720;
|
|
3482
|
+
*/
|
|
3483
|
+
ceiling(key: K): K | undefined {
|
|
3484
|
+
this._validateKey(key);
|
|
3485
|
+
return this.#core.ceiling(key);
|
|
3486
|
+
}
|
|
3487
|
+
|
|
3488
|
+
/**
|
|
3489
|
+
* Largest key that is <= the given key.
|
|
3490
|
+
|
|
3491
|
+
|
|
3492
|
+
|
|
3493
|
+
|
|
3494
|
+
|
|
3495
|
+
|
|
3496
|
+
|
|
3497
|
+
|
|
3498
|
+
|
|
3499
|
+
|
|
3500
|
+
|
|
3501
|
+
|
|
3502
|
+
|
|
3503
|
+
|
|
3504
|
+
|
|
3505
|
+
|
|
3506
|
+
|
|
3507
|
+
|
|
3508
|
+
|
|
3509
|
+
|
|
3510
|
+
|
|
3511
|
+
|
|
3512
|
+
|
|
3513
|
+
|
|
3514
|
+
|
|
3515
|
+
|
|
3516
|
+
|
|
3517
|
+
|
|
3518
|
+
|
|
3519
|
+
|
|
3520
|
+
|
|
3521
|
+
|
|
3522
|
+
|
|
3523
|
+
|
|
3524
|
+
|
|
3525
|
+
|
|
3526
|
+
|
|
3527
|
+
|
|
3528
|
+
|
|
3529
|
+
|
|
3530
|
+
|
|
3531
|
+
|
|
3532
|
+
|
|
3533
|
+
|
|
3534
|
+
|
|
3535
|
+
|
|
3536
|
+
|
|
3537
|
+
|
|
3538
|
+
|
|
3539
|
+
|
|
3540
|
+
|
|
3541
|
+
|
|
3542
|
+
|
|
3543
|
+
|
|
3544
|
+
|
|
3545
|
+
|
|
3546
|
+
|
|
3547
|
+
|
|
3548
|
+
|
|
3549
|
+
|
|
3550
|
+
|
|
3551
|
+
|
|
3552
|
+
|
|
3553
|
+
|
|
3554
|
+
|
|
3555
|
+
|
|
3556
|
+
|
|
3557
|
+
|
|
3558
|
+
|
|
3559
|
+
|
|
3560
|
+
|
|
3561
|
+
|
|
3562
|
+
|
|
3563
|
+
|
|
3564
|
+
|
|
3565
|
+
|
|
3566
|
+
|
|
3567
|
+
|
|
3568
|
+
|
|
3569
|
+
|
|
3570
|
+
|
|
3571
|
+
|
|
3572
|
+
|
|
3573
|
+
|
|
3574
|
+
|
|
3575
|
+
|
|
3576
|
+
|
|
3577
|
+
|
|
3578
|
+
|
|
3579
|
+
|
|
3580
|
+
|
|
3581
|
+
|
|
3582
|
+
|
|
3583
|
+
|
|
3584
|
+
|
|
3585
|
+
|
|
3586
|
+
|
|
3587
|
+
|
|
3588
|
+
|
|
3589
|
+
|
|
3590
|
+
|
|
3591
|
+
|
|
3592
|
+
|
|
3593
|
+
|
|
3594
|
+
|
|
3595
|
+
|
|
3596
|
+
|
|
3597
|
+
|
|
3598
|
+
|
|
3599
|
+
|
|
3600
|
+
|
|
3601
|
+
|
|
3602
|
+
|
|
3603
|
+
|
|
3604
|
+
|
|
3605
|
+
|
|
3606
|
+
|
|
3607
|
+
|
|
3608
|
+
|
|
3609
|
+
|
|
3610
|
+
|
|
3611
|
+
|
|
3612
|
+
|
|
3613
|
+
|
|
3614
|
+
|
|
3615
|
+
|
|
3616
|
+
|
|
3617
|
+
|
|
3618
|
+
|
|
3619
|
+
|
|
3620
|
+
|
|
3621
|
+
|
|
3622
|
+
|
|
3623
|
+
|
|
3624
|
+
* @example
|
|
3625
|
+
* // Largest element ≤ target
|
|
3626
|
+
* const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
|
|
3627
|
+
*
|
|
3628
|
+
* // Current width is 800 → which breakpoint applies?
|
|
3629
|
+
* console.log(breakpoints.floor(800)); // 768;
|
|
3630
|
+
* console.log(breakpoints.floor(1024)); // 1024; // exact match
|
|
3631
|
+
* console.log(breakpoints.floor(100)); // undefined;
|
|
3632
|
+
*/
|
|
3633
|
+
floor(key: K): K | undefined {
|
|
3634
|
+
this._validateKey(key);
|
|
3635
|
+
return this.#core.floor(key);
|
|
3636
|
+
}
|
|
3637
|
+
|
|
3638
|
+
/**
|
|
3639
|
+
* Smallest key that is > the given key.
|
|
3640
|
+
|
|
3641
|
+
|
|
3642
|
+
|
|
3643
|
+
|
|
3644
|
+
|
|
3645
|
+
|
|
3646
|
+
|
|
3647
|
+
|
|
3648
|
+
|
|
3649
|
+
|
|
3650
|
+
|
|
3651
|
+
|
|
3652
|
+
|
|
3653
|
+
|
|
3654
|
+
|
|
3655
|
+
|
|
3656
|
+
|
|
3657
|
+
|
|
3658
|
+
|
|
3659
|
+
|
|
3660
|
+
|
|
3661
|
+
|
|
3662
|
+
|
|
3663
|
+
|
|
3664
|
+
|
|
3665
|
+
|
|
3666
|
+
|
|
3667
|
+
|
|
3668
|
+
|
|
3669
|
+
|
|
3670
|
+
|
|
3671
|
+
|
|
3672
|
+
|
|
3673
|
+
|
|
3674
|
+
|
|
3675
|
+
|
|
3676
|
+
|
|
3677
|
+
|
|
3678
|
+
|
|
3679
|
+
|
|
3680
|
+
|
|
3681
|
+
|
|
3682
|
+
|
|
3683
|
+
|
|
3684
|
+
|
|
3685
|
+
|
|
3686
|
+
|
|
3687
|
+
|
|
3688
|
+
|
|
3689
|
+
|
|
3690
|
+
|
|
3691
|
+
|
|
3692
|
+
|
|
3693
|
+
|
|
3694
|
+
|
|
3695
|
+
|
|
3696
|
+
|
|
3697
|
+
|
|
3698
|
+
|
|
3699
|
+
|
|
3700
|
+
|
|
3701
|
+
|
|
3702
|
+
|
|
3703
|
+
|
|
3704
|
+
|
|
3705
|
+
|
|
3706
|
+
|
|
3707
|
+
|
|
3708
|
+
|
|
3709
|
+
|
|
3710
|
+
|
|
3711
|
+
|
|
3712
|
+
|
|
3713
|
+
|
|
3714
|
+
|
|
3715
|
+
|
|
3716
|
+
|
|
3717
|
+
|
|
3718
|
+
|
|
3719
|
+
|
|
3720
|
+
|
|
3721
|
+
|
|
3722
|
+
|
|
3723
|
+
|
|
3724
|
+
|
|
3725
|
+
|
|
3726
|
+
|
|
3727
|
+
|
|
3728
|
+
|
|
3729
|
+
|
|
3730
|
+
|
|
3731
|
+
|
|
3732
|
+
|
|
3733
|
+
|
|
3734
|
+
|
|
3735
|
+
|
|
3736
|
+
|
|
3737
|
+
|
|
3738
|
+
|
|
3739
|
+
|
|
3740
|
+
|
|
3741
|
+
|
|
3742
|
+
|
|
3743
|
+
|
|
3744
|
+
|
|
3745
|
+
|
|
3746
|
+
|
|
3747
|
+
|
|
3748
|
+
|
|
3749
|
+
|
|
3750
|
+
|
|
3751
|
+
|
|
3752
|
+
|
|
3753
|
+
|
|
3754
|
+
|
|
3755
|
+
|
|
3756
|
+
|
|
3757
|
+
|
|
3758
|
+
|
|
3759
|
+
|
|
3760
|
+
|
|
3761
|
+
|
|
3762
|
+
|
|
3763
|
+
|
|
3764
|
+
|
|
3765
|
+
|
|
3766
|
+
|
|
3767
|
+
|
|
3768
|
+
|
|
3769
|
+
|
|
3770
|
+
|
|
3771
|
+
|
|
3772
|
+
|
|
3773
|
+
|
|
3774
|
+
* @example
|
|
3775
|
+
* // Smallest element strictly > target
|
|
3776
|
+
* const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
|
|
3777
|
+
*
|
|
3778
|
+
* console.log(levels.higher(10)); // 25;
|
|
3779
|
+
* console.log(levels.higher(100)); // undefined;
|
|
3780
|
+
*/
|
|
3781
|
+
higher(key: K): K | undefined {
|
|
3782
|
+
this._validateKey(key);
|
|
3783
|
+
return this.#core.higher(key);
|
|
3784
|
+
}
|
|
3785
|
+
|
|
3786
|
+
/**
|
|
3787
|
+
* Largest key that is < the given key.
|
|
3788
|
+
|
|
3789
|
+
|
|
3790
|
+
|
|
3791
|
+
|
|
3792
|
+
|
|
3793
|
+
|
|
3794
|
+
|
|
3795
|
+
|
|
3796
|
+
|
|
3797
|
+
|
|
3798
|
+
|
|
3799
|
+
|
|
3800
|
+
|
|
3801
|
+
|
|
3802
|
+
|
|
3803
|
+
|
|
3804
|
+
|
|
3805
|
+
|
|
3806
|
+
|
|
3807
|
+
|
|
3808
|
+
|
|
3809
|
+
|
|
3810
|
+
|
|
3811
|
+
|
|
3812
|
+
|
|
3813
|
+
|
|
3814
|
+
|
|
3815
|
+
|
|
3816
|
+
|
|
3817
|
+
|
|
3818
|
+
|
|
3819
|
+
|
|
3820
|
+
|
|
3821
|
+
|
|
3822
|
+
|
|
3823
|
+
|
|
3824
|
+
|
|
3825
|
+
|
|
3826
|
+
|
|
3827
|
+
|
|
3828
|
+
|
|
3829
|
+
|
|
3830
|
+
|
|
3831
|
+
|
|
3832
|
+
|
|
3833
|
+
|
|
3834
|
+
|
|
3835
|
+
|
|
3836
|
+
|
|
3837
|
+
|
|
3838
|
+
|
|
3839
|
+
|
|
3840
|
+
|
|
3841
|
+
|
|
3842
|
+
|
|
3843
|
+
|
|
3844
|
+
|
|
3845
|
+
|
|
3846
|
+
|
|
3847
|
+
|
|
3848
|
+
|
|
3849
|
+
|
|
3850
|
+
|
|
3851
|
+
|
|
3852
|
+
|
|
3853
|
+
|
|
3854
|
+
|
|
3855
|
+
|
|
3856
|
+
|
|
3857
|
+
|
|
3858
|
+
|
|
3859
|
+
|
|
3860
|
+
|
|
3861
|
+
|
|
3862
|
+
|
|
3863
|
+
|
|
3864
|
+
|
|
3865
|
+
|
|
3866
|
+
|
|
3867
|
+
|
|
3868
|
+
|
|
3869
|
+
|
|
3870
|
+
|
|
3871
|
+
|
|
3872
|
+
|
|
3873
|
+
|
|
3874
|
+
|
|
3875
|
+
|
|
3876
|
+
|
|
3877
|
+
|
|
3878
|
+
|
|
3879
|
+
|
|
3880
|
+
|
|
3881
|
+
|
|
3882
|
+
|
|
3883
|
+
|
|
3884
|
+
|
|
3885
|
+
|
|
3886
|
+
|
|
3887
|
+
|
|
3888
|
+
|
|
3889
|
+
|
|
3890
|
+
|
|
3891
|
+
|
|
3892
|
+
|
|
3893
|
+
|
|
3894
|
+
|
|
3895
|
+
|
|
3896
|
+
|
|
3897
|
+
|
|
3898
|
+
|
|
3899
|
+
|
|
3900
|
+
|
|
3901
|
+
|
|
3902
|
+
|
|
3903
|
+
|
|
3904
|
+
|
|
3905
|
+
|
|
3906
|
+
|
|
3907
|
+
|
|
3908
|
+
|
|
3909
|
+
|
|
3910
|
+
|
|
3911
|
+
|
|
3912
|
+
|
|
3913
|
+
|
|
3914
|
+
|
|
3915
|
+
|
|
3916
|
+
|
|
3917
|
+
|
|
3918
|
+
|
|
3919
|
+
|
|
3920
|
+
|
|
3921
|
+
|
|
3922
|
+
* @example
|
|
3923
|
+
* // Largest element strictly < target
|
|
3924
|
+
* const tiers = new TreeSet<number>([100, 200, 500, 1000]);
|
|
3925
|
+
*
|
|
3926
|
+
* console.log(tiers.lower(500)); // 200;
|
|
3927
|
+
* console.log(tiers.lower(100)); // undefined;
|
|
1513
3928
|
*/
|
|
1514
3929
|
lower(key: K): K | undefined {
|
|
1515
3930
|
this._validateKey(key);
|
|
@@ -1542,6 +3957,98 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1542
3957
|
|
|
1543
3958
|
|
|
1544
3959
|
|
|
3960
|
+
|
|
3961
|
+
|
|
3962
|
+
|
|
3963
|
+
|
|
3964
|
+
|
|
3965
|
+
|
|
3966
|
+
|
|
3967
|
+
|
|
3968
|
+
|
|
3969
|
+
|
|
3970
|
+
|
|
3971
|
+
|
|
3972
|
+
|
|
3973
|
+
|
|
3974
|
+
|
|
3975
|
+
|
|
3976
|
+
|
|
3977
|
+
|
|
3978
|
+
|
|
3979
|
+
|
|
3980
|
+
|
|
3981
|
+
|
|
3982
|
+
|
|
3983
|
+
|
|
3984
|
+
|
|
3985
|
+
|
|
3986
|
+
|
|
3987
|
+
|
|
3988
|
+
|
|
3989
|
+
|
|
3990
|
+
|
|
3991
|
+
|
|
3992
|
+
|
|
3993
|
+
|
|
3994
|
+
|
|
3995
|
+
|
|
3996
|
+
|
|
3997
|
+
|
|
3998
|
+
|
|
3999
|
+
|
|
4000
|
+
|
|
4001
|
+
|
|
4002
|
+
|
|
4003
|
+
|
|
4004
|
+
|
|
4005
|
+
|
|
4006
|
+
|
|
4007
|
+
|
|
4008
|
+
|
|
4009
|
+
|
|
4010
|
+
|
|
4011
|
+
|
|
4012
|
+
|
|
4013
|
+
|
|
4014
|
+
|
|
4015
|
+
|
|
4016
|
+
|
|
4017
|
+
|
|
4018
|
+
|
|
4019
|
+
|
|
4020
|
+
|
|
4021
|
+
|
|
4022
|
+
|
|
4023
|
+
|
|
4024
|
+
|
|
4025
|
+
|
|
4026
|
+
|
|
4027
|
+
|
|
4028
|
+
|
|
4029
|
+
|
|
4030
|
+
|
|
4031
|
+
|
|
4032
|
+
|
|
4033
|
+
|
|
4034
|
+
|
|
4035
|
+
|
|
4036
|
+
|
|
4037
|
+
|
|
4038
|
+
|
|
4039
|
+
|
|
4040
|
+
|
|
4041
|
+
|
|
4042
|
+
|
|
4043
|
+
|
|
4044
|
+
|
|
4045
|
+
|
|
4046
|
+
|
|
4047
|
+
|
|
4048
|
+
|
|
4049
|
+
|
|
4050
|
+
|
|
4051
|
+
|
|
1545
4052
|
|
|
1546
4053
|
|
|
1547
4054
|
|
|
@@ -1602,6 +4109,66 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1602
4109
|
return out;
|
|
1603
4110
|
}
|
|
1604
4111
|
|
|
4112
|
+
// ─── Order-Statistic Methods ───────────────────────────
|
|
4113
|
+
|
|
4114
|
+
/**
|
|
4115
|
+
* Returns the element at the k-th position in tree order (0-indexed).
|
|
4116
|
+
* @remarks Time O(log n). Requires `enableOrderStatistic: true`.
|
|
4117
|
+
|
|
4118
|
+
|
|
4119
|
+
|
|
4120
|
+
* @example
|
|
4121
|
+
* // Find k-th element in a TreeSet
|
|
4122
|
+
* const set = new TreeSet<number>([30, 10, 50, 20, 40], { enableOrderStatistic: true });
|
|
4123
|
+
* console.log(set.getByRank(0)); // 10;
|
|
4124
|
+
* console.log(set.getByRank(2)); // 30;
|
|
4125
|
+
* console.log(set.getRank(30)); // 2;
|
|
4126
|
+
*/
|
|
4127
|
+
getByRank(k: number): K | undefined {
|
|
4128
|
+
return this.#core.getByRank(k);
|
|
4129
|
+
}
|
|
4130
|
+
|
|
4131
|
+
/**
|
|
4132
|
+
* Returns the 0-based rank of a key (number of elements that precede it in tree order).
|
|
4133
|
+
* @remarks Time O(log n). Requires `enableOrderStatistic: true`.
|
|
4134
|
+
* @example
|
|
4135
|
+
* // Get the rank of a key in sorted order
|
|
4136
|
+
* const tree = new TreeSet<number>(
|
|
4137
|
+
* [10, 20, 30, 40, 50],
|
|
4138
|
+
* { enableOrderStatistic: true }
|
|
4139
|
+
* );
|
|
4140
|
+
* console.log(tree.getRank(10)); // 0; // smallest → rank 0
|
|
4141
|
+
* console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
|
|
4142
|
+
* console.log(tree.getRank(50)); // 4; // largest → rank 4
|
|
4143
|
+
* console.log(tree.getRank(25)); // 2;
|
|
4144
|
+
*/
|
|
4145
|
+
getRank(key: K): number {
|
|
4146
|
+
return this.#core.getRank(key);
|
|
4147
|
+
}
|
|
4148
|
+
|
|
4149
|
+
/**
|
|
4150
|
+
* Returns elements by rank range (0-indexed, inclusive on both ends).
|
|
4151
|
+
* @remarks Time O(log n + k). Requires `enableOrderStatistic: true`.
|
|
4152
|
+
|
|
4153
|
+
* @example
|
|
4154
|
+
* // Pagination with rangeByRank
|
|
4155
|
+
* const tree = new TreeSet<number>(
|
|
4156
|
+
* [10, 20, 30, 40, 50, 60, 70, 80, 90],
|
|
4157
|
+
* { enableOrderStatistic: true }
|
|
4158
|
+
* );
|
|
4159
|
+
* const pageSize = 3;
|
|
4160
|
+
*
|
|
4161
|
+
* // Page 1
|
|
4162
|
+
* console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
|
|
4163
|
+
* // Page 2
|
|
4164
|
+
* console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
|
|
4165
|
+
* // Page 3
|
|
4166
|
+
* console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
|
|
4167
|
+
*/
|
|
4168
|
+
rangeByRank(start: number, end: number): K[] {
|
|
4169
|
+
return this.#core.rangeByRank(start, end).filter((k): k is K => k !== undefined);
|
|
4170
|
+
}
|
|
4171
|
+
|
|
1605
4172
|
/**
|
|
1606
4173
|
* Creates a shallow clone of this set.
|
|
1607
4174
|
* @remarks Time O(n log n), Space O(n)
|
|
@@ -1628,6 +4195,121 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1628
4195
|
|
|
1629
4196
|
|
|
1630
4197
|
|
|
4198
|
+
|
|
4199
|
+
|
|
4200
|
+
|
|
4201
|
+
|
|
4202
|
+
|
|
4203
|
+
|
|
4204
|
+
|
|
4205
|
+
|
|
4206
|
+
|
|
4207
|
+
|
|
4208
|
+
|
|
4209
|
+
|
|
4210
|
+
|
|
4211
|
+
|
|
4212
|
+
|
|
4213
|
+
|
|
4214
|
+
|
|
4215
|
+
|
|
4216
|
+
|
|
4217
|
+
|
|
4218
|
+
|
|
4219
|
+
|
|
4220
|
+
|
|
4221
|
+
|
|
4222
|
+
|
|
4223
|
+
|
|
4224
|
+
|
|
4225
|
+
|
|
4226
|
+
|
|
4227
|
+
|
|
4228
|
+
|
|
4229
|
+
|
|
4230
|
+
|
|
4231
|
+
|
|
4232
|
+
|
|
4233
|
+
|
|
4234
|
+
|
|
4235
|
+
|
|
4236
|
+
|
|
4237
|
+
|
|
4238
|
+
|
|
4239
|
+
|
|
4240
|
+
|
|
4241
|
+
|
|
4242
|
+
|
|
4243
|
+
|
|
4244
|
+
|
|
4245
|
+
|
|
4246
|
+
|
|
4247
|
+
|
|
4248
|
+
|
|
4249
|
+
|
|
4250
|
+
|
|
4251
|
+
|
|
4252
|
+
|
|
4253
|
+
|
|
4254
|
+
|
|
4255
|
+
|
|
4256
|
+
|
|
4257
|
+
|
|
4258
|
+
|
|
4259
|
+
|
|
4260
|
+
|
|
4261
|
+
|
|
4262
|
+
|
|
4263
|
+
|
|
4264
|
+
|
|
4265
|
+
|
|
4266
|
+
|
|
4267
|
+
|
|
4268
|
+
|
|
4269
|
+
|
|
4270
|
+
|
|
4271
|
+
|
|
4272
|
+
|
|
4273
|
+
|
|
4274
|
+
|
|
4275
|
+
|
|
4276
|
+
|
|
4277
|
+
|
|
4278
|
+
|
|
4279
|
+
|
|
4280
|
+
|
|
4281
|
+
|
|
4282
|
+
|
|
4283
|
+
|
|
4284
|
+
|
|
4285
|
+
|
|
4286
|
+
|
|
4287
|
+
|
|
4288
|
+
|
|
4289
|
+
|
|
4290
|
+
|
|
4291
|
+
|
|
4292
|
+
|
|
4293
|
+
|
|
4294
|
+
|
|
4295
|
+
|
|
4296
|
+
|
|
4297
|
+
|
|
4298
|
+
|
|
4299
|
+
|
|
4300
|
+
|
|
4301
|
+
|
|
4302
|
+
|
|
4303
|
+
|
|
4304
|
+
|
|
4305
|
+
|
|
4306
|
+
|
|
4307
|
+
|
|
4308
|
+
|
|
4309
|
+
|
|
4310
|
+
|
|
4311
|
+
|
|
4312
|
+
|
|
1631
4313
|
|
|
1632
4314
|
|
|
1633
4315
|
|