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.
Files changed (222) hide show
  1. package/.vitepress/cache/deps_temp_51f5f1b0/chunk-7OIKW5WK.js +12984 -0
  2. package/.vitepress/cache/deps_temp_51f5f1b0/package.json +3 -0
  3. package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vue_devtools-api.js +4505 -0
  4. package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vueuse_core.js +9731 -0
  5. package/.vitepress/cache/deps_temp_51f5f1b0/vue.js +347 -0
  6. package/CHANGELOG.md +3 -1
  7. package/README.md +63 -26
  8. package/dist/cjs/binary-tree.cjs +23698 -0
  9. package/dist/cjs/graph.cjs +5236 -0
  10. package/dist/cjs/hash.cjs +1262 -0
  11. package/dist/cjs/heap.cjs +1540 -0
  12. package/dist/cjs/index.cjs +28244 -14795
  13. package/dist/cjs/linked-list.cjs +4370 -0
  14. package/dist/cjs/matrix.cjs +1042 -0
  15. package/dist/cjs/priority-queue.cjs +1314 -0
  16. package/dist/cjs/queue.cjs +4090 -0
  17. package/dist/cjs/stack.cjs +861 -0
  18. package/dist/cjs/trie.cjs +1173 -0
  19. package/dist/cjs-legacy/binary-tree.cjs +23730 -0
  20. package/dist/cjs-legacy/graph.cjs +5234 -0
  21. package/dist/cjs-legacy/hash.cjs +1262 -0
  22. package/dist/cjs-legacy/heap.cjs +1537 -0
  23. package/dist/cjs-legacy/index.cjs +28239 -14790
  24. package/dist/cjs-legacy/linked-list.cjs +4376 -0
  25. package/dist/cjs-legacy/matrix.cjs +1045 -0
  26. package/dist/cjs-legacy/priority-queue.cjs +1312 -0
  27. package/dist/cjs-legacy/queue.cjs +4088 -0
  28. package/dist/cjs-legacy/stack.cjs +861 -0
  29. package/dist/cjs-legacy/trie.cjs +1172 -0
  30. package/dist/esm/binary-tree.mjs +23683 -0
  31. package/dist/esm/graph.mjs +5223 -0
  32. package/dist/esm/hash.mjs +1259 -0
  33. package/dist/esm/heap.mjs +1534 -0
  34. package/dist/esm/index.mjs +28242 -14796
  35. package/dist/esm/linked-list.mjs +4363 -0
  36. package/dist/esm/matrix.mjs +1038 -0
  37. package/dist/esm/priority-queue.mjs +1310 -0
  38. package/dist/esm/queue.mjs +4086 -0
  39. package/dist/esm/stack.mjs +859 -0
  40. package/dist/esm/trie.mjs +1170 -0
  41. package/dist/esm-legacy/binary-tree.mjs +23715 -0
  42. package/dist/esm-legacy/graph.mjs +5221 -0
  43. package/dist/esm-legacy/hash.mjs +1259 -0
  44. package/dist/esm-legacy/heap.mjs +1531 -0
  45. package/dist/esm-legacy/index.mjs +28237 -14791
  46. package/dist/esm-legacy/linked-list.mjs +4369 -0
  47. package/dist/esm-legacy/matrix.mjs +1041 -0
  48. package/dist/esm-legacy/priority-queue.mjs +1308 -0
  49. package/dist/esm-legacy/queue.mjs +4084 -0
  50. package/dist/esm-legacy/stack.mjs +859 -0
  51. package/dist/esm-legacy/trie.mjs +1169 -0
  52. package/dist/types/data-structures/base/index.d.ts +1 -0
  53. package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
  54. package/dist/types/data-structures/base/linear-base.d.ts +3 -3
  55. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +240 -0
  56. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +280 -0
  57. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +502 -2
  58. package/dist/types/data-structures/binary-tree/bst.d.ts +481 -1
  59. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +380 -0
  60. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +120 -1
  61. package/dist/types/data-structures/binary-tree/tree-map.d.ts +2764 -384
  62. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2753 -353
  63. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2241 -321
  64. package/dist/types/data-structures/binary-tree/tree-set.d.ts +2554 -274
  65. package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
  66. package/dist/types/data-structures/graph/directed-graph.d.ts +200 -0
  67. package/dist/types/data-structures/graph/undirected-graph.d.ts +180 -0
  68. package/dist/types/data-structures/hash/hash-map.d.ts +230 -10
  69. package/dist/types/data-structures/heap/heap.d.ts +280 -0
  70. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +343 -3
  71. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +303 -3
  72. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +362 -2
  73. package/dist/types/data-structures/matrix/matrix.d.ts +160 -0
  74. package/dist/types/data-structures/queue/deque.d.ts +304 -4
  75. package/dist/types/data-structures/queue/queue.d.ts +240 -0
  76. package/dist/types/data-structures/stack/stack.d.ts +200 -0
  77. package/dist/types/data-structures/trie/trie.d.ts +244 -4
  78. package/dist/types/interfaces/graph.d.ts +1 -1
  79. package/dist/types/types/common.d.ts +2 -2
  80. package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
  81. package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
  82. package/dist/types/types/utils/validate-type.d.ts +4 -4
  83. package/dist/umd/data-structure-typed.js +28022 -14573
  84. package/dist/umd/data-structure-typed.min.js +9 -3
  85. package/docs-site-docusaurus/README.md +41 -0
  86. package/docs-site-docusaurus/docs/api/README.md +52 -0
  87. package/docs-site-docusaurus/docs/api/classes/AVLTree.md +6130 -0
  88. package/docs-site-docusaurus/docs/api/classes/AVLTreeNode.md +282 -0
  89. package/docs-site-docusaurus/docs/api/classes/AbstractGraph.md +2266 -0
  90. package/docs-site-docusaurus/docs/api/classes/BST.md +5831 -0
  91. package/docs-site-docusaurus/docs/api/classes/BSTNode.md +333 -0
  92. package/docs-site-docusaurus/docs/api/classes/BinaryIndexedTree.md +455 -0
  93. package/docs-site-docusaurus/docs/api/classes/BinaryTree.md +4647 -0
  94. package/docs-site-docusaurus/docs/api/classes/BinaryTreeNode.md +331 -0
  95. package/docs-site-docusaurus/docs/api/classes/Deque.md +2767 -0
  96. package/docs-site-docusaurus/docs/api/classes/DirectedGraph.md +2999 -0
  97. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedList.md +2685 -0
  98. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedListNode.md +221 -0
  99. package/docs-site-docusaurus/docs/api/classes/FibonacciHeap.md +253 -0
  100. package/docs-site-docusaurus/docs/api/classes/FibonacciHeapNode.md +21 -0
  101. package/docs-site-docusaurus/docs/api/classes/HashMap.md +1333 -0
  102. package/docs-site-docusaurus/docs/api/classes/Heap.md +1881 -0
  103. package/docs-site-docusaurus/docs/api/classes/IterableElementBase.md +800 -0
  104. package/docs-site-docusaurus/docs/api/classes/IterableEntryBase.md +644 -0
  105. package/docs-site-docusaurus/docs/api/classes/LinearBase.md +1632 -0
  106. package/docs-site-docusaurus/docs/api/classes/LinearLinkedBase.md +1853 -0
  107. package/docs-site-docusaurus/docs/api/classes/LinkedHashMap.md +1108 -0
  108. package/docs-site-docusaurus/docs/api/classes/LinkedListNode.md +156 -0
  109. package/docs-site-docusaurus/docs/api/classes/LinkedListQueue.md +2824 -0
  110. package/docs-site-docusaurus/docs/api/classes/MapGraph.md +2929 -0
  111. package/docs-site-docusaurus/docs/api/classes/Matrix.md +1026 -0
  112. package/docs-site-docusaurus/docs/api/classes/MaxHeap.md +1866 -0
  113. package/docs-site-docusaurus/docs/api/classes/MaxPriorityQueue.md +1883 -0
  114. package/docs-site-docusaurus/docs/api/classes/MinHeap.md +1879 -0
  115. package/docs-site-docusaurus/docs/api/classes/MinPriorityQueue.md +1882 -0
  116. package/docs-site-docusaurus/docs/api/classes/Navigator.md +109 -0
  117. package/docs-site-docusaurus/docs/api/classes/PriorityQueue.md +1839 -0
  118. package/docs-site-docusaurus/docs/api/classes/Queue.md +2244 -0
  119. package/docs-site-docusaurus/docs/api/classes/RedBlackTree.md +6374 -0
  120. package/docs-site-docusaurus/docs/api/classes/SegmentTree.md +372 -0
  121. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedList.md +2897 -0
  122. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedListNode.md +169 -0
  123. package/docs-site-docusaurus/docs/api/classes/SkipList.md +1229 -0
  124. package/docs-site-docusaurus/docs/api/classes/Stack.md +1573 -0
  125. package/docs-site-docusaurus/docs/api/classes/TreeMap.md +1257 -0
  126. package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +1475 -0
  127. package/docs-site-docusaurus/docs/api/classes/TreeSet.md +1117 -0
  128. package/docs-site-docusaurus/docs/api/classes/Trie.md +1708 -0
  129. package/docs-site-docusaurus/docs/api/classes/TrieNode.md +199 -0
  130. package/docs-site-docusaurus/docs/api/classes/UndirectedGraph.md +2979 -0
  131. package/docs-site-docusaurus/docs/guide/_category_.json +6 -0
  132. package/docs-site-docusaurus/docs/guide/architecture.md +613 -0
  133. package/docs-site-docusaurus/docs/guide/concepts.md +420 -0
  134. package/docs-site-docusaurus/docs/guide/guides.md +611 -0
  135. package/docs-site-docusaurus/docs/guide/installation.md +60 -0
  136. package/docs-site-docusaurus/docs/guide/integrations.md +823 -0
  137. package/docs-site-docusaurus/docs/guide/overview.md +638 -0
  138. package/docs-site-docusaurus/docs/guide/performance.md +833 -0
  139. package/docs-site-docusaurus/docs/guide/quick-start.md +73 -0
  140. package/docs-site-docusaurus/docusaurus.config.ts +159 -0
  141. package/docs-site-docusaurus/fix-mdx-generics.mjs +75 -0
  142. package/docs-site-docusaurus/package-lock.json +18667 -0
  143. package/docs-site-docusaurus/package.json +50 -0
  144. package/docs-site-docusaurus/prefix-class-to-methods.mjs +48 -0
  145. package/docs-site-docusaurus/sidebars.ts +23 -0
  146. package/docs-site-docusaurus/sort-protected.mjs +87 -0
  147. package/docs-site-docusaurus/src/css/custom.css +96 -0
  148. package/docs-site-docusaurus/src/pages/index.module.css +13 -0
  149. package/docs-site-docusaurus/src/pages/index.tsx +71 -0
  150. package/docs-site-docusaurus/src/pages/markdown-page.md +7 -0
  151. package/docs-site-docusaurus/src/theme/TOCItems/index.tsx +34 -0
  152. package/docs-site-docusaurus/static/.nojekyll +0 -0
  153. package/docs-site-docusaurus/static/img/docusaurus-social-card.jpg +0 -0
  154. package/docs-site-docusaurus/static/img/docusaurus.png +0 -0
  155. package/docs-site-docusaurus/static/img/favicon.ico +0 -0
  156. package/docs-site-docusaurus/static/img/favicon.png +0 -0
  157. package/docs-site-docusaurus/static/img/logo-180.png +0 -0
  158. package/docs-site-docusaurus/static/img/logo.jpg +0 -0
  159. package/docs-site-docusaurus/static/img/logo.png +0 -0
  160. package/docs-site-docusaurus/static/img/logo.svg +1 -0
  161. package/docs-site-docusaurus/static/img/og-image.png +0 -0
  162. package/docs-site-docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
  163. package/docs-site-docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
  164. package/docs-site-docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
  165. package/docs-site-docusaurus/static/robots.txt +4 -0
  166. package/docs-site-docusaurus/typedoc.json +23 -0
  167. package/package.json +106 -10
  168. package/src/data-structures/base/index.ts +1 -0
  169. package/src/data-structures/base/iterable-entry-base.ts +8 -8
  170. package/src/data-structures/base/linear-base.ts +3 -3
  171. package/src/data-structures/binary-tree/avl-tree.ts +240 -0
  172. package/src/data-structures/binary-tree/binary-indexed-tree.ts +281 -1
  173. package/src/data-structures/binary-tree/binary-tree.ts +502 -2
  174. package/src/data-structures/binary-tree/bst.ts +481 -1
  175. package/src/data-structures/binary-tree/red-black-tree.ts +380 -0
  176. package/src/data-structures/binary-tree/segment-tree.ts +121 -2
  177. package/src/data-structures/binary-tree/tree-map.ts +2862 -482
  178. package/src/data-structures/binary-tree/tree-multi-map.ts +2963 -563
  179. package/src/data-structures/binary-tree/tree-multi-set.ts +2399 -479
  180. package/src/data-structures/binary-tree/tree-set.ts +2685 -405
  181. package/src/data-structures/graph/abstract-graph.ts +4 -4
  182. package/src/data-structures/graph/directed-graph.ts +200 -0
  183. package/src/data-structures/graph/undirected-graph.ts +180 -0
  184. package/src/data-structures/hash/hash-map.ts +235 -15
  185. package/src/data-structures/heap/heap.ts +280 -0
  186. package/src/data-structures/linked-list/doubly-linked-list.ts +343 -3
  187. package/src/data-structures/linked-list/singly-linked-list.ts +303 -3
  188. package/src/data-structures/linked-list/skip-linked-list.ts +362 -2
  189. package/src/data-structures/matrix/matrix.ts +161 -1
  190. package/src/data-structures/queue/deque.ts +305 -5
  191. package/src/data-structures/queue/queue.ts +240 -0
  192. package/src/data-structures/stack/stack.ts +200 -0
  193. package/src/data-structures/trie/trie.ts +245 -5
  194. package/src/interfaces/graph.ts +1 -1
  195. package/src/types/common.ts +2 -2
  196. package/src/types/data-structures/heap/heap.ts +1 -0
  197. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
  198. package/src/types/utils/validate-type.ts +4 -4
  199. package/vercel.json +6 -0
  200. package/dist/leetcode/avl-tree-counter.mjs +0 -2957
  201. package/dist/leetcode/avl-tree-multi-map.mjs +0 -2889
  202. package/dist/leetcode/avl-tree.mjs +0 -2720
  203. package/dist/leetcode/binary-tree.mjs +0 -1594
  204. package/dist/leetcode/bst.mjs +0 -2398
  205. package/dist/leetcode/deque.mjs +0 -683
  206. package/dist/leetcode/directed-graph.mjs +0 -1733
  207. package/dist/leetcode/doubly-linked-list.mjs +0 -709
  208. package/dist/leetcode/hash-map.mjs +0 -493
  209. package/dist/leetcode/heap.mjs +0 -542
  210. package/dist/leetcode/max-heap.mjs +0 -375
  211. package/dist/leetcode/max-priority-queue.mjs +0 -383
  212. package/dist/leetcode/min-heap.mjs +0 -363
  213. package/dist/leetcode/min-priority-queue.mjs +0 -371
  214. package/dist/leetcode/priority-queue.mjs +0 -363
  215. package/dist/leetcode/queue.mjs +0 -943
  216. package/dist/leetcode/red-black-tree.mjs +0 -2765
  217. package/dist/leetcode/singly-linked-list.mjs +0 -754
  218. package/dist/leetcode/stack.mjs +0 -217
  219. package/dist/leetcode/tree-counter.mjs +0 -3039
  220. package/dist/leetcode/tree-multi-map.mjs +0 -2913
  221. package/dist/leetcode/trie.mjs +0 -413
  222. 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
- * // 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;
251
+ * // Check empty
252
+ * console.log(new TreeSet().isEmpty()); // true;
308
253
  */
309
- has(key: K): boolean {
310
- this._validateKey(key);
311
- return this.#core.has(key);
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
- * Delete a key.
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
- * @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.
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
- * // Get sorted keys
488
- * const ts = new TreeSet<number>([30, 10, 20]);
489
- * console.log([...ts.keys()]); // [10, 20, 30];
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
- keys(): IterableIterator<K> {
492
- return this.#core.keys();
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
- * Iterate over values in ascending order.
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
- * // Test all
908
- * const ts = new TreeSet<number>([2, 4, 6]);
909
- * console.log(ts.every(k => k > 0)); // true;
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
- 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;
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
- * Test whether any value satisfies a predicate.
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
- * @example
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