data-structure-typed 2.5.0 → 2.5.2

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