data-structure-typed 2.5.0 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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 +3 -1
- package/README.md +63 -26
- package/dist/cjs/binary-tree.cjs +23698 -0
- package/dist/cjs/graph.cjs +5236 -0
- package/dist/cjs/hash.cjs +1262 -0
- package/dist/cjs/heap.cjs +1540 -0
- package/dist/cjs/index.cjs +28244 -14795
- package/dist/cjs/linked-list.cjs +4370 -0
- package/dist/cjs/matrix.cjs +1042 -0
- package/dist/cjs/priority-queue.cjs +1314 -0
- package/dist/cjs/queue.cjs +4090 -0
- package/dist/cjs/stack.cjs +861 -0
- package/dist/cjs/trie.cjs +1173 -0
- package/dist/cjs-legacy/binary-tree.cjs +23730 -0
- package/dist/cjs-legacy/graph.cjs +5234 -0
- package/dist/cjs-legacy/hash.cjs +1262 -0
- package/dist/cjs-legacy/heap.cjs +1537 -0
- package/dist/cjs-legacy/index.cjs +28239 -14790
- package/dist/cjs-legacy/linked-list.cjs +4376 -0
- package/dist/cjs-legacy/matrix.cjs +1045 -0
- package/dist/cjs-legacy/priority-queue.cjs +1312 -0
- package/dist/cjs-legacy/queue.cjs +4088 -0
- package/dist/cjs-legacy/stack.cjs +861 -0
- package/dist/cjs-legacy/trie.cjs +1172 -0
- package/dist/esm/binary-tree.mjs +23683 -0
- package/dist/esm/graph.mjs +5223 -0
- package/dist/esm/hash.mjs +1259 -0
- package/dist/esm/heap.mjs +1534 -0
- package/dist/esm/index.mjs +28242 -14796
- package/dist/esm/linked-list.mjs +4363 -0
- package/dist/esm/matrix.mjs +1038 -0
- package/dist/esm/priority-queue.mjs +1310 -0
- package/dist/esm/queue.mjs +4086 -0
- package/dist/esm/stack.mjs +859 -0
- package/dist/esm/trie.mjs +1170 -0
- package/dist/esm-legacy/binary-tree.mjs +23715 -0
- package/dist/esm-legacy/graph.mjs +5221 -0
- package/dist/esm-legacy/hash.mjs +1259 -0
- package/dist/esm-legacy/heap.mjs +1531 -0
- package/dist/esm-legacy/index.mjs +28237 -14791
- package/dist/esm-legacy/linked-list.mjs +4369 -0
- package/dist/esm-legacy/matrix.mjs +1041 -0
- package/dist/esm-legacy/priority-queue.mjs +1308 -0
- package/dist/esm-legacy/queue.mjs +4084 -0
- package/dist/esm-legacy/stack.mjs +859 -0
- package/dist/esm-legacy/trie.mjs +1169 -0
- 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 +240 -0
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +280 -0
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +502 -2
- package/dist/types/data-structures/binary-tree/bst.d.ts +481 -1
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +380 -0
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +120 -1
- package/dist/types/data-structures/binary-tree/tree-map.d.ts +2764 -384
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2753 -353
- package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2241 -321
- package/dist/types/data-structures/binary-tree/tree-set.d.ts +2554 -274
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/types/data-structures/graph/directed-graph.d.ts +200 -0
- package/dist/types/data-structures/graph/undirected-graph.d.ts +180 -0
- package/dist/types/data-structures/hash/hash-map.d.ts +230 -10
- package/dist/types/data-structures/heap/heap.d.ts +280 -0
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +343 -3
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +303 -3
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +362 -2
- package/dist/types/data-structures/matrix/matrix.d.ts +160 -0
- package/dist/types/data-structures/queue/deque.d.ts +304 -4
- package/dist/types/data-structures/queue/queue.d.ts +240 -0
- package/dist/types/data-structures/stack/stack.d.ts +200 -0
- package/dist/types/data-structures/trie/trie.d.ts +244 -4
- package/dist/types/interfaces/graph.d.ts +1 -1
- package/dist/types/types/common.d.ts +2 -2
- package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
- package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
- package/dist/types/types/utils/validate-type.d.ts +4 -4
- package/dist/umd/data-structure-typed.js +28022 -14573
- package/dist/umd/data-structure-typed.min.js +9 -3
- 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 +6130 -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 +5831 -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 +6374 -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 +1257 -0
- package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +1475 -0
- package/docs-site-docusaurus/docs/api/classes/TreeSet.md +1117 -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 +613 -0
- package/docs-site-docusaurus/docs/guide/concepts.md +420 -0
- package/docs-site-docusaurus/docs/guide/guides.md +611 -0
- package/docs-site-docusaurus/docs/guide/installation.md +60 -0
- package/docs-site-docusaurus/docs/guide/integrations.md +823 -0
- package/docs-site-docusaurus/docs/guide/overview.md +638 -0
- package/docs-site-docusaurus/docs/guide/performance.md +833 -0
- package/docs-site-docusaurus/docs/guide/quick-start.md +73 -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 +71 -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/robots.txt +4 -0
- package/docs-site-docusaurus/typedoc.json +23 -0
- package/package.json +106 -10
- package/src/data-structures/base/index.ts +1 -0
- package/src/data-structures/base/iterable-entry-base.ts +8 -8
- package/src/data-structures/base/linear-base.ts +3 -3
- package/src/data-structures/binary-tree/avl-tree.ts +240 -0
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +281 -1
- package/src/data-structures/binary-tree/binary-tree.ts +502 -2
- package/src/data-structures/binary-tree/bst.ts +481 -1
- package/src/data-structures/binary-tree/red-black-tree.ts +380 -0
- package/src/data-structures/binary-tree/segment-tree.ts +121 -2
- package/src/data-structures/binary-tree/tree-map.ts +2862 -482
- package/src/data-structures/binary-tree/tree-multi-map.ts +2963 -563
- package/src/data-structures/binary-tree/tree-multi-set.ts +2399 -479
- package/src/data-structures/binary-tree/tree-set.ts +2685 -405
- package/src/data-structures/graph/abstract-graph.ts +4 -4
- package/src/data-structures/graph/directed-graph.ts +200 -0
- package/src/data-structures/graph/undirected-graph.ts +180 -0
- package/src/data-structures/hash/hash-map.ts +235 -15
- package/src/data-structures/heap/heap.ts +280 -0
- package/src/data-structures/linked-list/doubly-linked-list.ts +343 -3
- package/src/data-structures/linked-list/singly-linked-list.ts +303 -3
- package/src/data-structures/linked-list/skip-linked-list.ts +362 -2
- package/src/data-structures/matrix/matrix.ts +161 -1
- package/src/data-structures/queue/deque.ts +305 -5
- package/src/data-structures/queue/queue.ts +240 -0
- package/src/data-structures/stack/stack.ts +200 -0
- package/src/data-structures/trie/trie.ts +245 -5
- package/src/interfaces/graph.ts +1 -1
- package/src/types/common.ts +2 -2
- package/src/types/data-structures/heap/heap.ts +1 -0
- package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
- package/src/types/utils/validate-type.ts +4 -4
- 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
|
@@ -147,36 +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
150
|
|
|
181
151
|
|
|
182
152
|
|
|
@@ -223,28 +193,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
223
193
|
|
|
224
194
|
|
|
225
195
|
|
|
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
196
|
|
|
249
197
|
|
|
250
198
|
|
|
@@ -300,20 +248,34 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
300
248
|
|
|
301
249
|
|
|
302
250
|
* @example
|
|
303
|
-
* //
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
* console.log(allowed.has('admin')); // true;
|
|
307
|
-
* console.log(allowed.has('guest')); // false;
|
|
251
|
+
* // Check empty
|
|
252
|
+
* console.log(new TreeSet().isEmpty()); // true;
|
|
308
253
|
*/
|
|
309
|
-
|
|
310
|
-
this.
|
|
311
|
-
|
|
254
|
+
isEmpty(): boolean {
|
|
255
|
+
return this.size === 0;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
private _validateKey(key: K): void {
|
|
259
|
+
if (!this.#isDefaultComparator) return;
|
|
260
|
+
|
|
261
|
+
if (typeof key === 'number') {
|
|
262
|
+
if (Number.isNaN(key)) throw new TypeError(ERR.invalidNaN('TreeSet'));
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (typeof key === 'string') return;
|
|
267
|
+
|
|
268
|
+
if (key instanceof Date) {
|
|
269
|
+
if (Number.isNaN(key.getTime())) throw new TypeError(ERR.invalidDate('TreeSet'));
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Other key types should have provided a comparator, so reaching here means misuse.
|
|
274
|
+
throw new TypeError(ERR.comparatorRequired('TreeSet'));
|
|
312
275
|
}
|
|
313
276
|
|
|
314
277
|
/**
|
|
315
|
-
*
|
|
316
|
-
* @returns `true` if the key existed; otherwise `false`.
|
|
278
|
+
* Add a key to the set (no-op if already present).
|
|
317
279
|
* @remarks Expected time O(log n)
|
|
318
280
|
|
|
319
281
|
|
|
@@ -369,22 +331,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
369
331
|
|
|
370
332
|
|
|
371
333
|
|
|
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
334
|
|
|
389
335
|
|
|
390
336
|
|
|
@@ -428,18 +374,12 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
428
374
|
|
|
429
375
|
|
|
430
376
|
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
clear(): void {
|
|
438
|
-
this.#core.clear();
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
/**
|
|
442
|
-
* Iterate over keys in ascending order.
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
|
|
443
383
|
|
|
444
384
|
|
|
445
385
|
|
|
@@ -484,18 +424,27 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
484
424
|
|
|
485
425
|
|
|
486
426
|
* @example
|
|
487
|
-
* //
|
|
488
|
-
* const
|
|
489
|
-
*
|
|
427
|
+
* // Unique tags with sorted order
|
|
428
|
+
* const tags = new TreeSet<string>(['javascript', 'typescript', 'react', 'typescript', 'node']);
|
|
429
|
+
*
|
|
430
|
+
* // Duplicates removed, sorted alphabetically
|
|
431
|
+
* console.log([...tags]); // ['javascript', 'node', 'react', 'typescript'];
|
|
432
|
+
* console.log(tags.size); // 4;
|
|
433
|
+
*
|
|
434
|
+
* tags.add('angular');
|
|
435
|
+
* console.log(tags.first()); // 'angular';
|
|
436
|
+
* console.log(tags.last()); // 'typescript';
|
|
490
437
|
*/
|
|
491
|
-
|
|
492
|
-
|
|
438
|
+
add(key: K): this {
|
|
439
|
+
this._validateKey(key);
|
|
440
|
+
// RBT.set returns boolean; Set.add returns this.
|
|
441
|
+
this.#core.set(key, undefined);
|
|
442
|
+
return this;
|
|
493
443
|
}
|
|
494
444
|
|
|
495
445
|
/**
|
|
496
|
-
*
|
|
497
|
-
*
|
|
498
|
-
* Note: for Set-like containers, `values()` is the same as `keys()`.
|
|
446
|
+
* Test whether a key exists.
|
|
447
|
+
* @remarks Expected time O(log n)
|
|
499
448
|
|
|
500
449
|
|
|
501
450
|
|
|
@@ -539,19 +488,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
539
488
|
|
|
540
489
|
|
|
541
490
|
|
|
542
|
-
* @example
|
|
543
|
-
* // Get values (same as keys for Set)
|
|
544
|
-
* const ts = new TreeSet<number>([2, 1, 3]);
|
|
545
|
-
* console.log([...ts.values()]); // [1, 2, 3];
|
|
546
|
-
*/
|
|
547
|
-
values(): IterableIterator<K> {
|
|
548
|
-
return this.keys();
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
/**
|
|
552
|
-
* Iterate over `[value, value]` pairs (native Set convention).
|
|
553
|
-
*
|
|
554
|
-
* Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
|
|
555
491
|
|
|
556
492
|
|
|
557
493
|
|
|
@@ -595,23 +531,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
595
531
|
|
|
596
532
|
|
|
597
533
|
|
|
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
534
|
|
|
616
535
|
|
|
617
536
|
|
|
@@ -655,22 +574,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
655
574
|
|
|
656
575
|
|
|
657
576
|
|
|
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
577
|
|
|
675
578
|
|
|
676
579
|
|
|
@@ -696,6 +599,31 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
696
599
|
|
|
697
600
|
|
|
698
601
|
|
|
602
|
+
* @example
|
|
603
|
+
* // Checking membership in a sorted collection
|
|
604
|
+
* const allowed = new TreeSet<string>(['admin', 'editor', 'viewer']);
|
|
605
|
+
*
|
|
606
|
+
* console.log(allowed.has('admin')); // true;
|
|
607
|
+
* console.log(allowed.has('guest')); // false;
|
|
608
|
+
*/
|
|
609
|
+
has(key: K): boolean {
|
|
610
|
+
this._validateKey(key);
|
|
611
|
+
return this.#core.has(key);
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Delete a key.
|
|
616
|
+
* @returns `true` if the key existed; otherwise `false`.
|
|
617
|
+
* @remarks Expected time O(log n)
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
|
|
699
627
|
|
|
700
628
|
|
|
701
629
|
|
|
@@ -714,31 +642,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
714
642
|
|
|
715
643
|
|
|
716
644
|
|
|
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
645
|
|
|
743
646
|
|
|
744
647
|
|
|
@@ -782,27 +685,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
782
685
|
|
|
783
686
|
|
|
784
687
|
|
|
785
|
-
* @example
|
|
786
|
-
* // Filter
|
|
787
|
-
* const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
|
|
788
|
-
* const evens = ts.filter(k => k % 2 === 0);
|
|
789
|
-
* console.log([...evens]); // [2, 4];
|
|
790
|
-
*/
|
|
791
|
-
filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
|
|
792
|
-
const out = new TreeSet<K>([], { comparator: this.#userComparator });
|
|
793
|
-
let index = 0;
|
|
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;
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
/**
|
|
804
|
-
* Reduce values into a single accumulator.
|
|
805
|
-
* @remarks Time O(n), Space O(1)
|
|
806
688
|
|
|
807
689
|
|
|
808
690
|
|
|
@@ -846,22 +728,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
846
728
|
|
|
847
729
|
|
|
848
730
|
|
|
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
731
|
|
|
866
732
|
|
|
867
733
|
|
|
@@ -904,24 +770,21 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
904
770
|
|
|
905
771
|
|
|
906
772
|
* @example
|
|
907
|
-
* //
|
|
908
|
-
* const
|
|
909
|
-
*
|
|
773
|
+
* // Removing elements while maintaining order
|
|
774
|
+
* const nums = new TreeSet<number>([1, 3, 5, 7, 9]);
|
|
775
|
+
*
|
|
776
|
+
* console.log(nums.delete(5)); // true;
|
|
777
|
+
* console.log(nums.delete(5)); // false; // already gone
|
|
778
|
+
* console.log([...nums]); // [1, 3, 7, 9];
|
|
910
779
|
*/
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
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;
|
|
780
|
+
delete(key: K): boolean {
|
|
781
|
+
this._validateKey(key);
|
|
782
|
+
const res = this.#core.delete(key);
|
|
783
|
+
return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
|
|
920
784
|
}
|
|
921
785
|
|
|
922
786
|
/**
|
|
923
|
-
*
|
|
924
|
-
* @remarks Time O(n), Space O(1)
|
|
787
|
+
* Remove all keys.
|
|
925
788
|
|
|
926
789
|
|
|
927
790
|
|
|
@@ -963,25 +826,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
963
826
|
|
|
964
827
|
|
|
965
828
|
|
|
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
829
|
|
|
986
830
|
|
|
987
831
|
|
|
@@ -1023,26 +867,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1023
867
|
|
|
1024
868
|
|
|
1025
869
|
|
|
1026
|
-
* @example
|
|
1027
|
-
* // Find entry
|
|
1028
|
-
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
1029
|
-
* const found = ts.find(k => k === 2);
|
|
1030
|
-
* console.log(found); // 2;
|
|
1031
|
-
*/
|
|
1032
|
-
find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
|
|
1033
|
-
let index = 0;
|
|
1034
|
-
for (const v of this) {
|
|
1035
|
-
const ok = thisArg === undefined
|
|
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;
|
|
1041
|
-
}
|
|
1042
|
-
|
|
1043
|
-
/**
|
|
1044
|
-
* Materialize the set into an array of keys.
|
|
1045
|
-
* @remarks Time O(n), Space O(n)
|
|
1046
870
|
|
|
1047
871
|
|
|
1048
872
|
|
|
@@ -1086,18 +910,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1086
910
|
|
|
1087
911
|
|
|
1088
912
|
|
|
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
913
|
|
|
1102
914
|
|
|
1103
915
|
|
|
@@ -1116,6 +928,18 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1116
928
|
|
|
1117
929
|
|
|
1118
930
|
|
|
931
|
+
* @example
|
|
932
|
+
* // Remove all
|
|
933
|
+
* const ts = new TreeSet<number>([1, 2]);
|
|
934
|
+
* ts.clear();
|
|
935
|
+
* console.log(ts.isEmpty()); // true;
|
|
936
|
+
*/
|
|
937
|
+
clear(): void {
|
|
938
|
+
this.#core.clear();
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
/**
|
|
942
|
+
* Iterate over keys in ascending order.
|
|
1119
943
|
|
|
1120
944
|
|
|
1121
945
|
|
|
@@ -1141,20 +965,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1141
965
|
|
|
1142
966
|
|
|
1143
967
|
|
|
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
968
|
|
|
1159
969
|
|
|
1160
970
|
|
|
@@ -1167,40 +977,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1167
977
|
|
|
1168
978
|
|
|
1169
979
|
|
|
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
980
|
|
|
1205
981
|
|
|
1206
982
|
|
|
@@ -1213,18 +989,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1213
989
|
|
|
1214
990
|
|
|
1215
991
|
|
|
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
992
|
|
|
1229
993
|
|
|
1230
994
|
|
|
@@ -1237,23 +1001,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1237
1001
|
|
|
1238
1002
|
|
|
1239
1003
|
|
|
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
1004
|
|
|
1258
1005
|
|
|
1259
1006
|
|
|
@@ -1266,22 +1013,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1266
1013
|
|
|
1267
1014
|
|
|
1268
1015
|
|
|
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
1016
|
|
|
1286
1017
|
|
|
1287
1018
|
|
|
@@ -1324,30 +1055,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1324
1055
|
|
|
1325
1056
|
|
|
1326
1057
|
|
|
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
1058
|
|
|
1352
1059
|
|
|
1353
1060
|
|
|
@@ -1376,6 +1083,19 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1376
1083
|
|
|
1377
1084
|
|
|
1378
1085
|
|
|
1086
|
+
* @example
|
|
1087
|
+
* // Get sorted keys
|
|
1088
|
+
* const ts = new TreeSet<number>([30, 10, 20]);
|
|
1089
|
+
* console.log([...ts.keys()]); // [10, 20, 30];
|
|
1090
|
+
*/
|
|
1091
|
+
keys(): IterableIterator<K> {
|
|
1092
|
+
return this.#core.keys();
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
/**
|
|
1096
|
+
* Iterate over values in ascending order.
|
|
1097
|
+
*
|
|
1098
|
+
* Note: for Set-like containers, `values()` is the same as `keys()`.
|
|
1379
1099
|
|
|
1380
1100
|
|
|
1381
1101
|
|
|
@@ -1390,22 +1110,6 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1390
1110
|
|
|
1391
1111
|
|
|
1392
1112
|
|
|
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
1113
|
|
|
1410
1114
|
|
|
1411
1115
|
|
|
@@ -1448,7 +1152,2323 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1448
1152
|
|
|
1449
1153
|
|
|
1450
1154
|
|
|
1451
|
-
|
|
1155
|
+
|
|
1156
|
+
|
|
1157
|
+
|
|
1158
|
+
|
|
1159
|
+
|
|
1160
|
+
|
|
1161
|
+
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
|
|
1165
|
+
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
|
|
1173
|
+
|
|
1174
|
+
|
|
1175
|
+
|
|
1176
|
+
|
|
1177
|
+
|
|
1178
|
+
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
|
|
1183
|
+
|
|
1184
|
+
|
|
1185
|
+
|
|
1186
|
+
|
|
1187
|
+
|
|
1188
|
+
|
|
1189
|
+
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
|
|
1193
|
+
|
|
1194
|
+
|
|
1195
|
+
|
|
1196
|
+
|
|
1197
|
+
|
|
1198
|
+
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
|
|
1205
|
+
|
|
1206
|
+
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
|
|
1212
|
+
|
|
1213
|
+
|
|
1214
|
+
|
|
1215
|
+
|
|
1216
|
+
|
|
1217
|
+
|
|
1218
|
+
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
|
|
1222
|
+
|
|
1223
|
+
|
|
1224
|
+
|
|
1225
|
+
|
|
1226
|
+
|
|
1227
|
+
|
|
1228
|
+
|
|
1229
|
+
|
|
1230
|
+
|
|
1231
|
+
|
|
1232
|
+
|
|
1233
|
+
|
|
1234
|
+
|
|
1235
|
+
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
|
|
1239
|
+
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
* @example
|
|
1243
|
+
* // Get values (same as keys for Set)
|
|
1244
|
+
* const ts = new TreeSet<number>([2, 1, 3]);
|
|
1245
|
+
* console.log([...ts.values()]); // [1, 2, 3];
|
|
1246
|
+
*/
|
|
1247
|
+
values(): IterableIterator<K> {
|
|
1248
|
+
return this.keys();
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
/**
|
|
1252
|
+
* Iterate over `[value, value]` pairs (native Set convention).
|
|
1253
|
+
*
|
|
1254
|
+
* Note: TreeSet stores only keys internally; `[k, k]` is created on-the-fly during iteration.
|
|
1255
|
+
|
|
1256
|
+
|
|
1257
|
+
|
|
1258
|
+
|
|
1259
|
+
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
|
|
1263
|
+
|
|
1264
|
+
|
|
1265
|
+
|
|
1266
|
+
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
|
|
1270
|
+
|
|
1271
|
+
|
|
1272
|
+
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
|
|
1278
|
+
|
|
1279
|
+
|
|
1280
|
+
|
|
1281
|
+
|
|
1282
|
+
|
|
1283
|
+
|
|
1284
|
+
|
|
1285
|
+
|
|
1286
|
+
|
|
1287
|
+
|
|
1288
|
+
|
|
1289
|
+
|
|
1290
|
+
|
|
1291
|
+
|
|
1292
|
+
|
|
1293
|
+
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
|
|
1299
|
+
|
|
1300
|
+
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
|
|
1306
|
+
|
|
1307
|
+
|
|
1308
|
+
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
|
|
1312
|
+
|
|
1313
|
+
|
|
1314
|
+
|
|
1315
|
+
|
|
1316
|
+
|
|
1317
|
+
|
|
1318
|
+
|
|
1319
|
+
|
|
1320
|
+
|
|
1321
|
+
|
|
1322
|
+
|
|
1323
|
+
|
|
1324
|
+
|
|
1325
|
+
|
|
1326
|
+
|
|
1327
|
+
|
|
1328
|
+
|
|
1329
|
+
|
|
1330
|
+
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
|
|
1334
|
+
|
|
1335
|
+
|
|
1336
|
+
|
|
1337
|
+
|
|
1338
|
+
|
|
1339
|
+
|
|
1340
|
+
|
|
1341
|
+
|
|
1342
|
+
|
|
1343
|
+
|
|
1344
|
+
|
|
1345
|
+
|
|
1346
|
+
|
|
1347
|
+
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
|
|
1357
|
+
|
|
1358
|
+
|
|
1359
|
+
|
|
1360
|
+
|
|
1361
|
+
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
|
|
1365
|
+
|
|
1366
|
+
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
|
|
1373
|
+
|
|
1374
|
+
|
|
1375
|
+
|
|
1376
|
+
|
|
1377
|
+
|
|
1378
|
+
|
|
1379
|
+
|
|
1380
|
+
|
|
1381
|
+
|
|
1382
|
+
|
|
1383
|
+
|
|
1384
|
+
|
|
1385
|
+
|
|
1386
|
+
|
|
1387
|
+
|
|
1388
|
+
|
|
1389
|
+
|
|
1390
|
+
|
|
1391
|
+
|
|
1392
|
+
|
|
1393
|
+
|
|
1394
|
+
|
|
1395
|
+
|
|
1396
|
+
|
|
1397
|
+
|
|
1398
|
+
* @example
|
|
1399
|
+
* // Iterate entries
|
|
1400
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1401
|
+
* console.log([...ts.entries()].map(([k]) => k)); // [1, 2, 3];
|
|
1402
|
+
*/
|
|
1403
|
+
*entries(): IterableIterator<[K, K]> {
|
|
1404
|
+
for (const k of this.keys()) yield [k, k];
|
|
1405
|
+
}
|
|
1406
|
+
|
|
1407
|
+
[Symbol.iterator](): IterableIterator<K> {
|
|
1408
|
+
return this.keys();
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
/**
|
|
1412
|
+
* Visit each value in ascending order.
|
|
1413
|
+
*
|
|
1414
|
+
* Callback follows native Set convention: `(value, value2, set)`.
|
|
1415
|
+
|
|
1416
|
+
|
|
1417
|
+
|
|
1418
|
+
|
|
1419
|
+
|
|
1420
|
+
|
|
1421
|
+
|
|
1422
|
+
|
|
1423
|
+
|
|
1424
|
+
|
|
1425
|
+
|
|
1426
|
+
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
|
|
1430
|
+
|
|
1431
|
+
|
|
1432
|
+
|
|
1433
|
+
|
|
1434
|
+
|
|
1435
|
+
|
|
1436
|
+
|
|
1437
|
+
|
|
1438
|
+
|
|
1439
|
+
|
|
1440
|
+
|
|
1441
|
+
|
|
1442
|
+
|
|
1443
|
+
|
|
1444
|
+
|
|
1445
|
+
|
|
1446
|
+
|
|
1447
|
+
|
|
1448
|
+
|
|
1449
|
+
|
|
1450
|
+
|
|
1451
|
+
|
|
1452
|
+
|
|
1453
|
+
|
|
1454
|
+
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
|
|
1458
|
+
|
|
1459
|
+
|
|
1460
|
+
|
|
1461
|
+
|
|
1462
|
+
|
|
1463
|
+
|
|
1464
|
+
|
|
1465
|
+
|
|
1466
|
+
|
|
1467
|
+
|
|
1468
|
+
|
|
1469
|
+
|
|
1470
|
+
|
|
1471
|
+
|
|
1472
|
+
|
|
1473
|
+
|
|
1474
|
+
|
|
1475
|
+
|
|
1476
|
+
|
|
1477
|
+
|
|
1478
|
+
|
|
1479
|
+
|
|
1480
|
+
|
|
1481
|
+
|
|
1482
|
+
|
|
1483
|
+
|
|
1484
|
+
|
|
1485
|
+
|
|
1486
|
+
|
|
1487
|
+
|
|
1488
|
+
|
|
1489
|
+
|
|
1490
|
+
|
|
1491
|
+
|
|
1492
|
+
|
|
1493
|
+
|
|
1494
|
+
|
|
1495
|
+
|
|
1496
|
+
|
|
1497
|
+
|
|
1498
|
+
|
|
1499
|
+
|
|
1500
|
+
|
|
1501
|
+
|
|
1502
|
+
|
|
1503
|
+
|
|
1504
|
+
|
|
1505
|
+
|
|
1506
|
+
|
|
1507
|
+
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
|
|
1511
|
+
|
|
1512
|
+
|
|
1513
|
+
|
|
1514
|
+
|
|
1515
|
+
|
|
1516
|
+
|
|
1517
|
+
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
|
|
1521
|
+
|
|
1522
|
+
|
|
1523
|
+
|
|
1524
|
+
|
|
1525
|
+
|
|
1526
|
+
|
|
1527
|
+
|
|
1528
|
+
|
|
1529
|
+
|
|
1530
|
+
|
|
1531
|
+
|
|
1532
|
+
|
|
1533
|
+
|
|
1534
|
+
|
|
1535
|
+
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
|
|
1539
|
+
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
|
|
1543
|
+
|
|
1544
|
+
|
|
1545
|
+
|
|
1546
|
+
|
|
1547
|
+
|
|
1548
|
+
|
|
1549
|
+
|
|
1550
|
+
|
|
1551
|
+
|
|
1552
|
+
|
|
1553
|
+
|
|
1554
|
+
|
|
1555
|
+
|
|
1556
|
+
|
|
1557
|
+
|
|
1558
|
+
* @example
|
|
1559
|
+
* // Execute for each
|
|
1560
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
1561
|
+
* const keys: number[] = [];
|
|
1562
|
+
* ts.forEach(k => keys.push(k));
|
|
1563
|
+
* console.log(keys); // [1, 2, 3];
|
|
1564
|
+
*/
|
|
1565
|
+
forEach(cb: (value: K, value2: K, set: TreeSet<K>) => void, thisArg?: unknown): void {
|
|
1566
|
+
for (const k of this) cb.call(thisArg, k, k, this);
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
/**
|
|
1570
|
+
* Create a new TreeSet by mapping each value to a new key.
|
|
1571
|
+
*
|
|
1572
|
+
* This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
|
|
1573
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
1574
|
+
|
|
1575
|
+
|
|
1576
|
+
|
|
1577
|
+
|
|
1578
|
+
|
|
1579
|
+
|
|
1580
|
+
|
|
1581
|
+
|
|
1582
|
+
|
|
1583
|
+
|
|
1584
|
+
|
|
1585
|
+
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
|
|
1589
|
+
|
|
1590
|
+
|
|
1591
|
+
|
|
1592
|
+
|
|
1593
|
+
|
|
1594
|
+
|
|
1595
|
+
|
|
1596
|
+
|
|
1597
|
+
|
|
1598
|
+
|
|
1599
|
+
|
|
1600
|
+
|
|
1601
|
+
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
|
|
1605
|
+
|
|
1606
|
+
|
|
1607
|
+
|
|
1608
|
+
|
|
1609
|
+
|
|
1610
|
+
|
|
1611
|
+
|
|
1612
|
+
|
|
1613
|
+
|
|
1614
|
+
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
|
|
1618
|
+
|
|
1619
|
+
|
|
1620
|
+
|
|
1621
|
+
|
|
1622
|
+
|
|
1623
|
+
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
|
|
1627
|
+
|
|
1628
|
+
|
|
1629
|
+
|
|
1630
|
+
|
|
1631
|
+
|
|
1632
|
+
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
|
|
1636
|
+
|
|
1637
|
+
|
|
1638
|
+
|
|
1639
|
+
|
|
1640
|
+
|
|
1641
|
+
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
|
|
1645
|
+
|
|
1646
|
+
|
|
1647
|
+
|
|
1648
|
+
|
|
1649
|
+
|
|
1650
|
+
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
|
|
1654
|
+
|
|
1655
|
+
|
|
1656
|
+
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
|
|
1660
|
+
|
|
1661
|
+
|
|
1662
|
+
|
|
1663
|
+
|
|
1664
|
+
|
|
1665
|
+
|
|
1666
|
+
|
|
1667
|
+
|
|
1668
|
+
|
|
1669
|
+
|
|
1670
|
+
|
|
1671
|
+
|
|
1672
|
+
|
|
1673
|
+
|
|
1674
|
+
|
|
1675
|
+
|
|
1676
|
+
|
|
1677
|
+
|
|
1678
|
+
|
|
1679
|
+
|
|
1680
|
+
|
|
1681
|
+
|
|
1682
|
+
|
|
1683
|
+
|
|
1684
|
+
|
|
1685
|
+
|
|
1686
|
+
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
|
|
1690
|
+
|
|
1691
|
+
|
|
1692
|
+
|
|
1693
|
+
|
|
1694
|
+
|
|
1695
|
+
|
|
1696
|
+
|
|
1697
|
+
|
|
1698
|
+
|
|
1699
|
+
|
|
1700
|
+
|
|
1701
|
+
|
|
1702
|
+
|
|
1703
|
+
|
|
1704
|
+
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
|
|
1708
|
+
|
|
1709
|
+
|
|
1710
|
+
|
|
1711
|
+
|
|
1712
|
+
|
|
1713
|
+
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
|
|
1717
|
+
* @example
|
|
1718
|
+
* // Transform
|
|
1719
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
1720
|
+
* const doubled = ts.map(k => k * 2);
|
|
1721
|
+
* console.log([...doubled]); // [2, 4, 6];
|
|
1722
|
+
*/
|
|
1723
|
+
map<MK>(
|
|
1724
|
+
callbackfn: TreeSetElementCallback<K, MK, TreeSet<K>>,
|
|
1725
|
+
options: Omit<TreeSetOptions<MK>, 'toElementFn'> & { comparator?: (a: MK, b: MK) => number } = {},
|
|
1726
|
+
thisArg?: unknown
|
|
1727
|
+
): TreeSet<MK> {
|
|
1728
|
+
const out = new TreeSet<MK>([], options as TreeSetOptions<MK>);
|
|
1729
|
+
let index = 0;
|
|
1730
|
+
for (const v of this) {
|
|
1731
|
+
const mk = thisArg === undefined
|
|
1732
|
+
? callbackfn(v, index++, this)
|
|
1733
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => MK).call(thisArg, v, index++, this);
|
|
1734
|
+
out.add(mk);
|
|
1735
|
+
}
|
|
1736
|
+
return out;
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
/**
|
|
1740
|
+
* Create a new TreeSet containing only values that satisfy the predicate.
|
|
1741
|
+
* @remarks Time O(n log n) expected, Space O(n)
|
|
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
|
+
|
|
1868
|
+
|
|
1869
|
+
|
|
1870
|
+
|
|
1871
|
+
|
|
1872
|
+
|
|
1873
|
+
|
|
1874
|
+
|
|
1875
|
+
|
|
1876
|
+
|
|
1877
|
+
|
|
1878
|
+
|
|
1879
|
+
|
|
1880
|
+
|
|
1881
|
+
|
|
1882
|
+
|
|
1883
|
+
|
|
1884
|
+
|
|
1885
|
+
* @example
|
|
1886
|
+
* // Filter
|
|
1887
|
+
* const ts = new TreeSet<number>([1, 2, 3, 4, 5]);
|
|
1888
|
+
* const evens = ts.filter(k => k % 2 === 0);
|
|
1889
|
+
* console.log([...evens]); // [2, 4];
|
|
1890
|
+
*/
|
|
1891
|
+
filter(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): TreeSet<K> {
|
|
1892
|
+
const out = new TreeSet<K>([], { comparator: this.#userComparator });
|
|
1893
|
+
let index = 0;
|
|
1894
|
+
for (const v of this) {
|
|
1895
|
+
const ok = thisArg === undefined
|
|
1896
|
+
? callbackfn(v, index++, this)
|
|
1897
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
1898
|
+
if (ok) out.add(v);
|
|
1899
|
+
}
|
|
1900
|
+
return out;
|
|
1901
|
+
}
|
|
1902
|
+
|
|
1903
|
+
/**
|
|
1904
|
+
* Reduce values into a single accumulator.
|
|
1905
|
+
* @remarks Time O(n), Space O(1)
|
|
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
|
+
* @example
|
|
2050
|
+
* // Aggregate
|
|
2051
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2052
|
+
* const sum = ts.reduce((acc, k) => acc + k, 0);
|
|
2053
|
+
* console.log(sum); // 6;
|
|
2054
|
+
*/
|
|
2055
|
+
reduce<A>(callbackfn: TreeSetReduceCallback<K, A, TreeSet<K>>, initialValue: A): A {
|
|
2056
|
+
let acc = initialValue;
|
|
2057
|
+
let index = 0;
|
|
2058
|
+
for (const v of this) acc = callbackfn(acc, v, index++, this);
|
|
2059
|
+
return acc;
|
|
2060
|
+
}
|
|
2061
|
+
|
|
2062
|
+
/**
|
|
2063
|
+
* Test whether all values satisfy a predicate.
|
|
2064
|
+
* @remarks Time O(n), Space O(1)
|
|
2065
|
+
|
|
2066
|
+
|
|
2067
|
+
|
|
2068
|
+
|
|
2069
|
+
|
|
2070
|
+
|
|
2071
|
+
|
|
2072
|
+
|
|
2073
|
+
|
|
2074
|
+
|
|
2075
|
+
|
|
2076
|
+
|
|
2077
|
+
|
|
2078
|
+
|
|
2079
|
+
|
|
2080
|
+
|
|
2081
|
+
|
|
2082
|
+
|
|
2083
|
+
|
|
2084
|
+
|
|
2085
|
+
|
|
2086
|
+
|
|
2087
|
+
|
|
2088
|
+
|
|
2089
|
+
|
|
2090
|
+
|
|
2091
|
+
|
|
2092
|
+
|
|
2093
|
+
|
|
2094
|
+
|
|
2095
|
+
|
|
2096
|
+
|
|
2097
|
+
|
|
2098
|
+
|
|
2099
|
+
|
|
2100
|
+
|
|
2101
|
+
|
|
2102
|
+
|
|
2103
|
+
|
|
2104
|
+
|
|
2105
|
+
|
|
2106
|
+
|
|
2107
|
+
|
|
2108
|
+
|
|
2109
|
+
|
|
2110
|
+
|
|
2111
|
+
|
|
2112
|
+
|
|
2113
|
+
|
|
2114
|
+
|
|
2115
|
+
|
|
2116
|
+
|
|
2117
|
+
|
|
2118
|
+
|
|
2119
|
+
|
|
2120
|
+
|
|
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
|
+
* @example
|
|
2207
|
+
* // Test all
|
|
2208
|
+
* const ts = new TreeSet<number>([2, 4, 6]);
|
|
2209
|
+
* console.log(ts.every(k => k > 0)); // true;
|
|
2210
|
+
*/
|
|
2211
|
+
every(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
2212
|
+
let index = 0;
|
|
2213
|
+
for (const v of this) {
|
|
2214
|
+
const ok = thisArg === undefined
|
|
2215
|
+
? callbackfn(v, index++, this)
|
|
2216
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2217
|
+
if (!ok) return false;
|
|
2218
|
+
}
|
|
2219
|
+
return true;
|
|
2220
|
+
}
|
|
2221
|
+
|
|
2222
|
+
/**
|
|
2223
|
+
* Test whether any value satisfies a predicate.
|
|
2224
|
+
* @remarks Time O(n), Space O(1)
|
|
2225
|
+
|
|
2226
|
+
|
|
2227
|
+
|
|
2228
|
+
|
|
2229
|
+
|
|
2230
|
+
|
|
2231
|
+
|
|
2232
|
+
|
|
2233
|
+
|
|
2234
|
+
|
|
2235
|
+
|
|
2236
|
+
|
|
2237
|
+
|
|
2238
|
+
|
|
2239
|
+
|
|
2240
|
+
|
|
2241
|
+
|
|
2242
|
+
|
|
2243
|
+
|
|
2244
|
+
|
|
2245
|
+
|
|
2246
|
+
|
|
2247
|
+
|
|
2248
|
+
|
|
2249
|
+
|
|
2250
|
+
|
|
2251
|
+
|
|
2252
|
+
|
|
2253
|
+
|
|
2254
|
+
|
|
2255
|
+
|
|
2256
|
+
|
|
2257
|
+
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
|
|
2261
|
+
|
|
2262
|
+
|
|
2263
|
+
|
|
2264
|
+
|
|
2265
|
+
|
|
2266
|
+
|
|
2267
|
+
|
|
2268
|
+
|
|
2269
|
+
|
|
2270
|
+
|
|
2271
|
+
|
|
2272
|
+
|
|
2273
|
+
|
|
2274
|
+
|
|
2275
|
+
|
|
2276
|
+
|
|
2277
|
+
|
|
2278
|
+
|
|
2279
|
+
|
|
2280
|
+
|
|
2281
|
+
|
|
2282
|
+
|
|
2283
|
+
|
|
2284
|
+
|
|
2285
|
+
|
|
2286
|
+
|
|
2287
|
+
|
|
2288
|
+
|
|
2289
|
+
|
|
2290
|
+
|
|
2291
|
+
|
|
2292
|
+
|
|
2293
|
+
|
|
2294
|
+
|
|
2295
|
+
|
|
2296
|
+
|
|
2297
|
+
|
|
2298
|
+
|
|
2299
|
+
|
|
2300
|
+
|
|
2301
|
+
|
|
2302
|
+
|
|
2303
|
+
|
|
2304
|
+
|
|
2305
|
+
|
|
2306
|
+
|
|
2307
|
+
|
|
2308
|
+
|
|
2309
|
+
|
|
2310
|
+
|
|
2311
|
+
|
|
2312
|
+
|
|
2313
|
+
|
|
2314
|
+
|
|
2315
|
+
|
|
2316
|
+
|
|
2317
|
+
|
|
2318
|
+
|
|
2319
|
+
|
|
2320
|
+
|
|
2321
|
+
|
|
2322
|
+
|
|
2323
|
+
|
|
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
|
+
* @example
|
|
2367
|
+
* // Test any
|
|
2368
|
+
* const ts = new TreeSet<number>([1, 3, 5]);
|
|
2369
|
+
* console.log(ts.some(k => k === 3)); // true;
|
|
2370
|
+
*/
|
|
2371
|
+
some(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): boolean {
|
|
2372
|
+
let index = 0;
|
|
2373
|
+
for (const v of this) {
|
|
2374
|
+
const ok = thisArg === undefined
|
|
2375
|
+
? callbackfn(v, index++, this)
|
|
2376
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2377
|
+
if (ok) return true;
|
|
2378
|
+
}
|
|
2379
|
+
return false;
|
|
2380
|
+
}
|
|
2381
|
+
|
|
2382
|
+
/**
|
|
2383
|
+
* Find the first value that satisfies a predicate.
|
|
2384
|
+
* @remarks Time O(n), Space O(1)
|
|
2385
|
+
|
|
2386
|
+
|
|
2387
|
+
|
|
2388
|
+
|
|
2389
|
+
|
|
2390
|
+
|
|
2391
|
+
|
|
2392
|
+
|
|
2393
|
+
|
|
2394
|
+
|
|
2395
|
+
|
|
2396
|
+
|
|
2397
|
+
|
|
2398
|
+
|
|
2399
|
+
|
|
2400
|
+
|
|
2401
|
+
|
|
2402
|
+
|
|
2403
|
+
|
|
2404
|
+
|
|
2405
|
+
|
|
2406
|
+
|
|
2407
|
+
|
|
2408
|
+
|
|
2409
|
+
|
|
2410
|
+
|
|
2411
|
+
|
|
2412
|
+
|
|
2413
|
+
|
|
2414
|
+
|
|
2415
|
+
|
|
2416
|
+
|
|
2417
|
+
|
|
2418
|
+
|
|
2419
|
+
|
|
2420
|
+
|
|
2421
|
+
|
|
2422
|
+
|
|
2423
|
+
|
|
2424
|
+
|
|
2425
|
+
|
|
2426
|
+
|
|
2427
|
+
|
|
2428
|
+
|
|
2429
|
+
|
|
2430
|
+
|
|
2431
|
+
|
|
2432
|
+
|
|
2433
|
+
|
|
2434
|
+
|
|
2435
|
+
|
|
2436
|
+
|
|
2437
|
+
|
|
2438
|
+
|
|
2439
|
+
|
|
2440
|
+
|
|
2441
|
+
|
|
2442
|
+
|
|
2443
|
+
|
|
2444
|
+
|
|
2445
|
+
|
|
2446
|
+
|
|
2447
|
+
|
|
2448
|
+
|
|
2449
|
+
|
|
2450
|
+
|
|
2451
|
+
|
|
2452
|
+
|
|
2453
|
+
|
|
2454
|
+
|
|
2455
|
+
|
|
2456
|
+
|
|
2457
|
+
|
|
2458
|
+
|
|
2459
|
+
|
|
2460
|
+
|
|
2461
|
+
|
|
2462
|
+
|
|
2463
|
+
|
|
2464
|
+
|
|
2465
|
+
|
|
2466
|
+
|
|
2467
|
+
|
|
2468
|
+
|
|
2469
|
+
|
|
2470
|
+
|
|
2471
|
+
|
|
2472
|
+
|
|
2473
|
+
|
|
2474
|
+
|
|
2475
|
+
|
|
2476
|
+
|
|
2477
|
+
|
|
2478
|
+
|
|
2479
|
+
|
|
2480
|
+
|
|
2481
|
+
|
|
2482
|
+
|
|
2483
|
+
|
|
2484
|
+
|
|
2485
|
+
|
|
2486
|
+
|
|
2487
|
+
|
|
2488
|
+
|
|
2489
|
+
|
|
2490
|
+
|
|
2491
|
+
|
|
2492
|
+
|
|
2493
|
+
|
|
2494
|
+
|
|
2495
|
+
|
|
2496
|
+
|
|
2497
|
+
|
|
2498
|
+
|
|
2499
|
+
|
|
2500
|
+
|
|
2501
|
+
|
|
2502
|
+
|
|
2503
|
+
|
|
2504
|
+
|
|
2505
|
+
|
|
2506
|
+
|
|
2507
|
+
|
|
2508
|
+
|
|
2509
|
+
|
|
2510
|
+
|
|
2511
|
+
|
|
2512
|
+
|
|
2513
|
+
|
|
2514
|
+
|
|
2515
|
+
|
|
2516
|
+
|
|
2517
|
+
|
|
2518
|
+
|
|
2519
|
+
|
|
2520
|
+
|
|
2521
|
+
|
|
2522
|
+
|
|
2523
|
+
|
|
2524
|
+
|
|
2525
|
+
|
|
2526
|
+
* @example
|
|
2527
|
+
* // Find entry
|
|
2528
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2529
|
+
* const found = ts.find(k => k === 2);
|
|
2530
|
+
* console.log(found); // 2;
|
|
2531
|
+
*/
|
|
2532
|
+
find(callbackfn: TreeSetElementCallback<K, boolean, TreeSet<K>>, thisArg?: unknown): K | undefined {
|
|
2533
|
+
let index = 0;
|
|
2534
|
+
for (const v of this) {
|
|
2535
|
+
const ok = thisArg === undefined
|
|
2536
|
+
? callbackfn(v, index++, this)
|
|
2537
|
+
: (callbackfn as (this: unknown, v: K, i: number, self: TreeSet<K>) => boolean).call(thisArg, v, index++, this);
|
|
2538
|
+
if (ok) return v;
|
|
2539
|
+
}
|
|
2540
|
+
return undefined;
|
|
2541
|
+
}
|
|
2542
|
+
|
|
2543
|
+
/**
|
|
2544
|
+
* Materialize the set into an array of keys.
|
|
2545
|
+
* @remarks Time O(n), Space O(n)
|
|
2546
|
+
|
|
2547
|
+
|
|
2548
|
+
|
|
2549
|
+
|
|
2550
|
+
|
|
2551
|
+
|
|
2552
|
+
|
|
2553
|
+
|
|
2554
|
+
|
|
2555
|
+
|
|
2556
|
+
|
|
2557
|
+
|
|
2558
|
+
|
|
2559
|
+
|
|
2560
|
+
|
|
2561
|
+
|
|
2562
|
+
|
|
2563
|
+
|
|
2564
|
+
|
|
2565
|
+
|
|
2566
|
+
|
|
2567
|
+
|
|
2568
|
+
|
|
2569
|
+
|
|
2570
|
+
|
|
2571
|
+
|
|
2572
|
+
|
|
2573
|
+
|
|
2574
|
+
|
|
2575
|
+
|
|
2576
|
+
|
|
2577
|
+
|
|
2578
|
+
|
|
2579
|
+
|
|
2580
|
+
|
|
2581
|
+
|
|
2582
|
+
|
|
2583
|
+
|
|
2584
|
+
|
|
2585
|
+
|
|
2586
|
+
|
|
2587
|
+
|
|
2588
|
+
|
|
2589
|
+
|
|
2590
|
+
|
|
2591
|
+
|
|
2592
|
+
|
|
2593
|
+
|
|
2594
|
+
|
|
2595
|
+
|
|
2596
|
+
|
|
2597
|
+
|
|
2598
|
+
|
|
2599
|
+
|
|
2600
|
+
|
|
2601
|
+
|
|
2602
|
+
|
|
2603
|
+
|
|
2604
|
+
|
|
2605
|
+
|
|
2606
|
+
|
|
2607
|
+
|
|
2608
|
+
|
|
2609
|
+
|
|
2610
|
+
|
|
2611
|
+
|
|
2612
|
+
|
|
2613
|
+
|
|
2614
|
+
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
|
|
2618
|
+
|
|
2619
|
+
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
|
|
2623
|
+
|
|
2624
|
+
|
|
2625
|
+
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
|
|
2629
|
+
|
|
2630
|
+
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
|
|
2634
|
+
|
|
2635
|
+
|
|
2636
|
+
|
|
2637
|
+
|
|
2638
|
+
|
|
2639
|
+
|
|
2640
|
+
|
|
2641
|
+
|
|
2642
|
+
|
|
2643
|
+
|
|
2644
|
+
|
|
2645
|
+
|
|
2646
|
+
|
|
2647
|
+
|
|
2648
|
+
|
|
2649
|
+
|
|
2650
|
+
|
|
2651
|
+
|
|
2652
|
+
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
|
|
2656
|
+
|
|
2657
|
+
|
|
2658
|
+
|
|
2659
|
+
|
|
2660
|
+
|
|
2661
|
+
|
|
2662
|
+
|
|
2663
|
+
|
|
2664
|
+
|
|
2665
|
+
|
|
2666
|
+
|
|
2667
|
+
|
|
2668
|
+
|
|
2669
|
+
|
|
2670
|
+
|
|
2671
|
+
|
|
2672
|
+
|
|
2673
|
+
|
|
2674
|
+
|
|
2675
|
+
|
|
2676
|
+
|
|
2677
|
+
|
|
2678
|
+
|
|
2679
|
+
|
|
2680
|
+
|
|
2681
|
+
|
|
2682
|
+
|
|
2683
|
+
|
|
2684
|
+
|
|
2685
|
+
|
|
2686
|
+
|
|
2687
|
+
|
|
2688
|
+
|
|
2689
|
+
* @example
|
|
2690
|
+
* // Convert to array
|
|
2691
|
+
* const ts = new TreeSet<number>([3, 1, 2]);
|
|
2692
|
+
* console.log(ts.toArray()); // [1, 2, 3];
|
|
2693
|
+
*/
|
|
2694
|
+
toArray(): K[] {
|
|
2695
|
+
return [...this];
|
|
2696
|
+
}
|
|
2697
|
+
|
|
2698
|
+
/**
|
|
2699
|
+
* Print a human-friendly representation.
|
|
2700
|
+
* @remarks Time O(n), Space O(n)
|
|
2701
|
+
|
|
2702
|
+
|
|
2703
|
+
|
|
2704
|
+
|
|
2705
|
+
|
|
2706
|
+
|
|
2707
|
+
|
|
2708
|
+
|
|
2709
|
+
|
|
2710
|
+
|
|
2711
|
+
|
|
2712
|
+
|
|
2713
|
+
|
|
2714
|
+
|
|
2715
|
+
|
|
2716
|
+
|
|
2717
|
+
|
|
2718
|
+
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
|
|
2722
|
+
|
|
2723
|
+
|
|
2724
|
+
|
|
2725
|
+
|
|
2726
|
+
|
|
2727
|
+
|
|
2728
|
+
|
|
2729
|
+
|
|
2730
|
+
|
|
2731
|
+
|
|
2732
|
+
|
|
2733
|
+
|
|
2734
|
+
|
|
2735
|
+
|
|
2736
|
+
|
|
2737
|
+
|
|
2738
|
+
|
|
2739
|
+
|
|
2740
|
+
|
|
2741
|
+
|
|
2742
|
+
|
|
2743
|
+
|
|
2744
|
+
|
|
2745
|
+
|
|
2746
|
+
|
|
2747
|
+
|
|
2748
|
+
|
|
2749
|
+
|
|
2750
|
+
|
|
2751
|
+
|
|
2752
|
+
|
|
2753
|
+
|
|
2754
|
+
|
|
2755
|
+
|
|
2756
|
+
|
|
2757
|
+
|
|
2758
|
+
|
|
2759
|
+
|
|
2760
|
+
|
|
2761
|
+
|
|
2762
|
+
|
|
2763
|
+
|
|
2764
|
+
|
|
2765
|
+
|
|
2766
|
+
|
|
2767
|
+
|
|
2768
|
+
|
|
2769
|
+
|
|
2770
|
+
|
|
2771
|
+
|
|
2772
|
+
|
|
2773
|
+
|
|
2774
|
+
|
|
2775
|
+
|
|
2776
|
+
|
|
2777
|
+
|
|
2778
|
+
|
|
2779
|
+
|
|
2780
|
+
|
|
2781
|
+
|
|
2782
|
+
|
|
2783
|
+
|
|
2784
|
+
|
|
2785
|
+
|
|
2786
|
+
|
|
2787
|
+
|
|
2788
|
+
|
|
2789
|
+
|
|
2790
|
+
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
|
|
2795
|
+
|
|
2796
|
+
|
|
2797
|
+
|
|
2798
|
+
|
|
2799
|
+
|
|
2800
|
+
|
|
2801
|
+
|
|
2802
|
+
|
|
2803
|
+
|
|
2804
|
+
|
|
2805
|
+
|
|
2806
|
+
|
|
2807
|
+
|
|
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
|
+
* @example
|
|
2845
|
+
* // Display tree
|
|
2846
|
+
* const ts = new TreeSet<number>([1, 2, 3]);
|
|
2847
|
+
* expect(() => ts.print()).not.toThrow();
|
|
2848
|
+
*/
|
|
2849
|
+
print(): void {
|
|
2850
|
+
// Delegate to the underlying tree's visualization.
|
|
2851
|
+
this.#core.print();
|
|
2852
|
+
}
|
|
2853
|
+
|
|
2854
|
+
// Navigable operations
|
|
2855
|
+
|
|
2856
|
+
/**
|
|
2857
|
+
* Smallest key in the set.
|
|
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
|
+
* @example
|
|
2891
|
+
* // Student grade ranking with custom comparator
|
|
2892
|
+
* interface Student {
|
|
2893
|
+
* name: string;
|
|
2894
|
+
* gpa: number;
|
|
2895
|
+
* }
|
|
2896
|
+
*
|
|
2897
|
+
* const ranking = new TreeSet<Student>(
|
|
2898
|
+
* [
|
|
2899
|
+
* { name: 'Alice', gpa: 3.8 },
|
|
2900
|
+
* { name: 'Bob', gpa: 3.5 },
|
|
2901
|
+
* { name: 'Charlie', gpa: 3.9 },
|
|
2902
|
+
* { name: 'Diana', gpa: 3.5 }
|
|
2903
|
+
* ],
|
|
2904
|
+
* { comparator: (a, b) => b.gpa - a.gpa || a.name.localeCompare(b.name) }
|
|
2905
|
+
* );
|
|
2906
|
+
*
|
|
2907
|
+
* // Sorted by GPA descending, then name ascending
|
|
2908
|
+
* const names = [...ranking].map(s => s.name);
|
|
2909
|
+
* console.log(names); // ['Charlie', 'Alice', 'Bob', 'Diana'];
|
|
2910
|
+
*
|
|
2911
|
+
* // Top student
|
|
2912
|
+
* console.log(ranking.first()?.name); // 'Charlie';
|
|
2913
|
+
*
|
|
2914
|
+
* // Filter students with GPA >= 3.8
|
|
2915
|
+
* const honors = ranking.filter(s => s.gpa >= 3.8);
|
|
2916
|
+
* console.log(honors.toArray().map(s => s.name)); // ['Charlie', 'Alice'];
|
|
2917
|
+
*/
|
|
2918
|
+
first(): K | undefined {
|
|
2919
|
+
return this.#core.getLeftMost();
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2922
|
+
/**
|
|
2923
|
+
* Largest key in the set.
|
|
2924
|
+
|
|
2925
|
+
|
|
2926
|
+
|
|
2927
|
+
|
|
2928
|
+
|
|
2929
|
+
|
|
2930
|
+
|
|
2931
|
+
|
|
2932
|
+
|
|
2933
|
+
|
|
2934
|
+
|
|
2935
|
+
|
|
2936
|
+
|
|
2937
|
+
|
|
2938
|
+
|
|
2939
|
+
|
|
2940
|
+
|
|
2941
|
+
|
|
2942
|
+
|
|
2943
|
+
|
|
2944
|
+
|
|
2945
|
+
|
|
2946
|
+
|
|
2947
|
+
|
|
2948
|
+
|
|
2949
|
+
|
|
2950
|
+
|
|
2951
|
+
|
|
2952
|
+
|
|
2953
|
+
|
|
2954
|
+
|
|
2955
|
+
|
|
2956
|
+
* @example
|
|
2957
|
+
* // Get the maximum element
|
|
2958
|
+
* const temps = new TreeSet<number>([18, 22, 15, 30, 25]);
|
|
2959
|
+
* console.log(temps.last()); // 30;
|
|
2960
|
+
* console.log(temps.first()); // 15;
|
|
2961
|
+
*/
|
|
2962
|
+
last(): K | undefined {
|
|
2963
|
+
return this.#core.getRightMost();
|
|
2964
|
+
}
|
|
2965
|
+
|
|
2966
|
+
/**
|
|
2967
|
+
* Remove and return the smallest key.
|
|
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
|
+
* @example
|
|
3001
|
+
* // Remove and return minimum
|
|
3002
|
+
* const queue = new TreeSet<number>([5, 1, 8, 3]);
|
|
3003
|
+
*
|
|
3004
|
+
* console.log(queue.pollFirst()); // 1;
|
|
3005
|
+
* console.log(queue.pollFirst()); // 3;
|
|
3006
|
+
* console.log(queue.size); // 2;
|
|
3007
|
+
*/
|
|
3008
|
+
pollFirst(): K | undefined {
|
|
3009
|
+
const k = this.first();
|
|
3010
|
+
if (k === undefined) return undefined;
|
|
3011
|
+
this.delete(k);
|
|
3012
|
+
return k;
|
|
3013
|
+
}
|
|
3014
|
+
|
|
3015
|
+
/**
|
|
3016
|
+
* Remove and return the largest key.
|
|
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
|
+
* @example
|
|
3050
|
+
* // Remove and return maximum
|
|
3051
|
+
* const stack = new TreeSet<number>([10, 20, 30]);
|
|
3052
|
+
*
|
|
3053
|
+
* console.log(stack.pollLast()); // 30;
|
|
3054
|
+
* console.log(stack.size); // 2;
|
|
3055
|
+
*/
|
|
3056
|
+
pollLast(): K | undefined {
|
|
3057
|
+
const k = this.last();
|
|
3058
|
+
if (k === undefined) return undefined;
|
|
3059
|
+
this.delete(k);
|
|
3060
|
+
return k;
|
|
3061
|
+
}
|
|
3062
|
+
|
|
3063
|
+
/**
|
|
3064
|
+
* Smallest key that is >= the given key.
|
|
3065
|
+
|
|
3066
|
+
|
|
3067
|
+
|
|
3068
|
+
|
|
3069
|
+
|
|
3070
|
+
|
|
3071
|
+
|
|
3072
|
+
|
|
3073
|
+
|
|
3074
|
+
|
|
3075
|
+
|
|
3076
|
+
|
|
3077
|
+
|
|
3078
|
+
|
|
3079
|
+
|
|
3080
|
+
|
|
3081
|
+
|
|
3082
|
+
|
|
3083
|
+
|
|
3084
|
+
|
|
3085
|
+
|
|
3086
|
+
|
|
3087
|
+
|
|
3088
|
+
|
|
3089
|
+
|
|
3090
|
+
|
|
3091
|
+
|
|
3092
|
+
|
|
3093
|
+
|
|
3094
|
+
|
|
3095
|
+
|
|
3096
|
+
|
|
3097
|
+
|
|
3098
|
+
|
|
3099
|
+
|
|
3100
|
+
|
|
3101
|
+
|
|
3102
|
+
|
|
3103
|
+
|
|
3104
|
+
|
|
3105
|
+
|
|
3106
|
+
|
|
3107
|
+
|
|
3108
|
+
|
|
3109
|
+
|
|
3110
|
+
|
|
3111
|
+
|
|
3112
|
+
|
|
3113
|
+
|
|
3114
|
+
|
|
3115
|
+
|
|
3116
|
+
|
|
3117
|
+
|
|
3118
|
+
|
|
3119
|
+
|
|
3120
|
+
|
|
3121
|
+
|
|
3122
|
+
|
|
3123
|
+
|
|
3124
|
+
|
|
3125
|
+
|
|
3126
|
+
|
|
3127
|
+
|
|
3128
|
+
|
|
3129
|
+
|
|
3130
|
+
|
|
3131
|
+
|
|
3132
|
+
|
|
3133
|
+
|
|
3134
|
+
|
|
3135
|
+
|
|
3136
|
+
|
|
3137
|
+
|
|
3138
|
+
|
|
3139
|
+
|
|
3140
|
+
|
|
3141
|
+
|
|
3142
|
+
|
|
3143
|
+
|
|
3144
|
+
|
|
3145
|
+
|
|
3146
|
+
|
|
3147
|
+
|
|
3148
|
+
|
|
3149
|
+
|
|
3150
|
+
|
|
3151
|
+
|
|
3152
|
+
|
|
3153
|
+
|
|
3154
|
+
|
|
3155
|
+
|
|
3156
|
+
|
|
3157
|
+
|
|
3158
|
+
|
|
3159
|
+
|
|
3160
|
+
|
|
3161
|
+
|
|
3162
|
+
|
|
3163
|
+
|
|
3164
|
+
|
|
3165
|
+
|
|
3166
|
+
|
|
3167
|
+
|
|
3168
|
+
|
|
3169
|
+
|
|
3170
|
+
|
|
3171
|
+
|
|
3172
|
+
|
|
3173
|
+
|
|
3174
|
+
|
|
3175
|
+
|
|
3176
|
+
|
|
3177
|
+
|
|
3178
|
+
|
|
3179
|
+
|
|
3180
|
+
|
|
3181
|
+
|
|
3182
|
+
|
|
3183
|
+
|
|
3184
|
+
|
|
3185
|
+
|
|
3186
|
+
|
|
3187
|
+
* @example
|
|
3188
|
+
* // Finding nearest available time slot
|
|
3189
|
+
* // Available appointment times (minutes from midnight)
|
|
3190
|
+
* const slots = new TreeSet<number>([540, 600, 660, 720, 840, 900]);
|
|
3191
|
+
*
|
|
3192
|
+
* // Customer wants something around 10:30 (630 min)
|
|
3193
|
+
* const nearest = slots.ceiling(630);
|
|
3194
|
+
* console.log(nearest); // 660; // 11:00 AM
|
|
3195
|
+
*
|
|
3196
|
+
* // What's the latest slot before 2:00 PM (840)?
|
|
3197
|
+
* const before2pm = slots.lower(840);
|
|
3198
|
+
* console.log(before2pm); // 720; // 12:00 PM
|
|
3199
|
+
*
|
|
3200
|
+
* // Book the 11:00 slot
|
|
3201
|
+
* slots.delete(660);
|
|
3202
|
+
* console.log(slots.ceiling(630)); // 720;
|
|
3203
|
+
*/
|
|
3204
|
+
ceiling(key: K): K | undefined {
|
|
3205
|
+
this._validateKey(key);
|
|
3206
|
+
return this.#core.ceiling(key);
|
|
3207
|
+
}
|
|
3208
|
+
|
|
3209
|
+
/**
|
|
3210
|
+
* Largest key that is <= the given key.
|
|
3211
|
+
|
|
3212
|
+
|
|
3213
|
+
|
|
3214
|
+
|
|
3215
|
+
|
|
3216
|
+
|
|
3217
|
+
|
|
3218
|
+
|
|
3219
|
+
|
|
3220
|
+
|
|
3221
|
+
|
|
3222
|
+
|
|
3223
|
+
|
|
3224
|
+
|
|
3225
|
+
|
|
3226
|
+
|
|
3227
|
+
|
|
3228
|
+
|
|
3229
|
+
|
|
3230
|
+
|
|
3231
|
+
|
|
3232
|
+
|
|
3233
|
+
|
|
3234
|
+
|
|
3235
|
+
|
|
3236
|
+
|
|
3237
|
+
|
|
3238
|
+
|
|
3239
|
+
|
|
3240
|
+
|
|
3241
|
+
|
|
3242
|
+
|
|
3243
|
+
|
|
3244
|
+
|
|
3245
|
+
|
|
3246
|
+
|
|
3247
|
+
|
|
3248
|
+
|
|
3249
|
+
|
|
3250
|
+
|
|
3251
|
+
|
|
3252
|
+
|
|
3253
|
+
|
|
3254
|
+
|
|
3255
|
+
|
|
3256
|
+
|
|
3257
|
+
|
|
3258
|
+
|
|
3259
|
+
|
|
3260
|
+
|
|
3261
|
+
|
|
3262
|
+
|
|
3263
|
+
|
|
3264
|
+
|
|
3265
|
+
|
|
3266
|
+
|
|
3267
|
+
|
|
3268
|
+
|
|
3269
|
+
|
|
3270
|
+
|
|
3271
|
+
|
|
3272
|
+
|
|
3273
|
+
|
|
3274
|
+
|
|
3275
|
+
|
|
3276
|
+
|
|
3277
|
+
|
|
3278
|
+
|
|
3279
|
+
|
|
3280
|
+
|
|
3281
|
+
|
|
3282
|
+
|
|
3283
|
+
|
|
3284
|
+
|
|
3285
|
+
|
|
3286
|
+
|
|
3287
|
+
|
|
3288
|
+
|
|
3289
|
+
|
|
3290
|
+
|
|
3291
|
+
|
|
3292
|
+
|
|
3293
|
+
|
|
3294
|
+
|
|
3295
|
+
|
|
3296
|
+
|
|
3297
|
+
|
|
3298
|
+
|
|
3299
|
+
|
|
3300
|
+
|
|
3301
|
+
|
|
3302
|
+
|
|
3303
|
+
|
|
3304
|
+
|
|
3305
|
+
|
|
3306
|
+
|
|
3307
|
+
|
|
3308
|
+
|
|
3309
|
+
|
|
3310
|
+
|
|
3311
|
+
|
|
3312
|
+
|
|
3313
|
+
|
|
3314
|
+
|
|
3315
|
+
|
|
3316
|
+
|
|
3317
|
+
|
|
3318
|
+
|
|
3319
|
+
|
|
3320
|
+
|
|
3321
|
+
|
|
3322
|
+
|
|
3323
|
+
|
|
3324
|
+
|
|
3325
|
+
|
|
3326
|
+
|
|
3327
|
+
|
|
3328
|
+
|
|
3329
|
+
|
|
3330
|
+
|
|
3331
|
+
|
|
3332
|
+
|
|
3333
|
+
* @example
|
|
3334
|
+
* // Largest element ≤ target
|
|
3335
|
+
* const breakpoints = new TreeSet<number>([320, 768, 1024, 1280, 1920]);
|
|
3336
|
+
*
|
|
3337
|
+
* // Current width is 800 → which breakpoint applies?
|
|
3338
|
+
* console.log(breakpoints.floor(800)); // 768;
|
|
3339
|
+
* console.log(breakpoints.floor(1024)); // 1024; // exact match
|
|
3340
|
+
* console.log(breakpoints.floor(100)); // undefined;
|
|
3341
|
+
*/
|
|
3342
|
+
floor(key: K): K | undefined {
|
|
3343
|
+
this._validateKey(key);
|
|
3344
|
+
return this.#core.floor(key);
|
|
3345
|
+
}
|
|
3346
|
+
|
|
3347
|
+
/**
|
|
3348
|
+
* Smallest key that is > the given key.
|
|
3349
|
+
|
|
3350
|
+
|
|
3351
|
+
|
|
3352
|
+
|
|
3353
|
+
|
|
3354
|
+
|
|
3355
|
+
|
|
3356
|
+
|
|
3357
|
+
|
|
3358
|
+
|
|
3359
|
+
|
|
3360
|
+
|
|
3361
|
+
|
|
3362
|
+
|
|
3363
|
+
|
|
3364
|
+
|
|
3365
|
+
|
|
3366
|
+
|
|
3367
|
+
|
|
3368
|
+
|
|
3369
|
+
|
|
3370
|
+
|
|
3371
|
+
|
|
3372
|
+
|
|
3373
|
+
|
|
3374
|
+
|
|
3375
|
+
|
|
3376
|
+
|
|
3377
|
+
|
|
3378
|
+
|
|
3379
|
+
|
|
3380
|
+
|
|
3381
|
+
|
|
3382
|
+
|
|
3383
|
+
|
|
3384
|
+
|
|
3385
|
+
|
|
3386
|
+
|
|
3387
|
+
|
|
3388
|
+
|
|
3389
|
+
|
|
3390
|
+
|
|
3391
|
+
|
|
3392
|
+
|
|
3393
|
+
|
|
3394
|
+
|
|
3395
|
+
|
|
3396
|
+
|
|
3397
|
+
|
|
3398
|
+
|
|
3399
|
+
|
|
3400
|
+
|
|
3401
|
+
|
|
3402
|
+
|
|
3403
|
+
|
|
3404
|
+
|
|
3405
|
+
|
|
3406
|
+
|
|
3407
|
+
|
|
3408
|
+
|
|
3409
|
+
|
|
3410
|
+
|
|
3411
|
+
|
|
3412
|
+
|
|
3413
|
+
|
|
3414
|
+
|
|
3415
|
+
|
|
3416
|
+
|
|
3417
|
+
|
|
3418
|
+
|
|
3419
|
+
|
|
3420
|
+
|
|
3421
|
+
|
|
3422
|
+
|
|
3423
|
+
|
|
3424
|
+
|
|
3425
|
+
|
|
3426
|
+
|
|
3427
|
+
|
|
3428
|
+
|
|
3429
|
+
|
|
3430
|
+
|
|
3431
|
+
|
|
3432
|
+
|
|
3433
|
+
|
|
3434
|
+
|
|
3435
|
+
|
|
3436
|
+
|
|
3437
|
+
|
|
3438
|
+
|
|
3439
|
+
|
|
3440
|
+
|
|
3441
|
+
|
|
3442
|
+
|
|
3443
|
+
|
|
3444
|
+
|
|
3445
|
+
|
|
3446
|
+
|
|
3447
|
+
|
|
3448
|
+
|
|
3449
|
+
|
|
3450
|
+
|
|
3451
|
+
|
|
3452
|
+
|
|
3453
|
+
|
|
3454
|
+
|
|
3455
|
+
|
|
3456
|
+
|
|
3457
|
+
|
|
3458
|
+
|
|
3459
|
+
|
|
3460
|
+
|
|
3461
|
+
|
|
3462
|
+
|
|
3463
|
+
|
|
3464
|
+
|
|
3465
|
+
|
|
3466
|
+
|
|
3467
|
+
|
|
3468
|
+
|
|
3469
|
+
|
|
3470
|
+
|
|
3471
|
+
* @example
|
|
1452
3472
|
* // Smallest element strictly > target
|
|
1453
3473
|
* const levels = new TreeSet<number>([1, 5, 10, 25, 50, 100]);
|
|
1454
3474
|
*
|
|
@@ -1483,6 +3503,86 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1483
3503
|
|
|
1484
3504
|
|
|
1485
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
|
+
|
|
1486
3586
|
|
|
1487
3587
|
|
|
1488
3588
|
|
|
@@ -1542,6 +3642,86 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1542
3642
|
|
|
1543
3643
|
|
|
1544
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
|
+
|
|
1545
3725
|
|
|
1546
3726
|
|
|
1547
3727
|
|
|
@@ -1628,6 +3808,106 @@ export class TreeSet<K = any, R = K> implements Iterable<K> {
|
|
|
1628
3808
|
|
|
1629
3809
|
|
|
1630
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
|
+
|
|
1631
3911
|
|
|
1632
3912
|
|
|
1633
3913
|
|