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
@@ -10,7 +10,7 @@
10
10
  import type { Comparator } from '../../types';
11
11
  import type { TreeMapEntryCallback, TreeMapOptions, TreeMapRangeOptions, TreeMapReduceCallback } from '../../types';
12
12
  import { RedBlackTree } from './red-black-tree';
13
- import { ERR } from '../../common';
13
+ import { ERR, raise } from '../../common';
14
14
 
15
15
  /**
16
16
  * An ordered Map backed by a red-black tree.
@@ -52,7 +52,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
52
52
  const comparator = options.comparator ?? TreeMap.createDefaultComparator<K>();
53
53
  this.#isDefaultComparator = options.comparator === undefined;
54
54
 
55
- this.#core = new RedBlackTree<K, V>([], { comparator, isMapMode: options.isMapMode });
55
+ this.#core = new RedBlackTree<K, V>([], { comparator, isMapMode: options.isMapMode, enableOrderStatistic: options.enableOrderStatistic });
56
56
 
57
57
  for (const item of entries) {
58
58
  let k: K;
@@ -64,7 +64,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
64
64
  } else {
65
65
  // Validate entries like native Map: each item must be a 2-tuple-like value.
66
66
  if (!Array.isArray(item) || item.length < 2) {
67
- throw new TypeError(ERR.invalidEntry('TreeMap'));
67
+ raise(TypeError, ERR.invalidEntry('TreeMap'));
68
68
  }
69
69
  k = item[0] as K;
70
70
  v = item[1] as V | undefined;
@@ -88,7 +88,7 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
88
88
  return (a: K, b: K): number => {
89
89
  if (typeof a === 'number' && typeof b === 'number') {
90
90
  /* istanbul ignore next -- _validateKey prevents NaN from entering the tree */
91
- if (Number.isNaN(a) || Number.isNaN(b)) throw new TypeError(ERR.invalidNaN('TreeMap'));
91
+ if (Number.isNaN(a) || Number.isNaN(b)) raise(TypeError, ERR.invalidNaN('TreeMap'));
92
92
  const aa = Object.is(a, -0) ? 0 : a;
93
93
  const bb = Object.is(b, -0) ? 0 : b;
94
94
  return aa > bb ? 1 : aa < bb ? -1 : 0;
@@ -102,11 +102,11 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
102
102
  const ta = a.getTime();
103
103
  const tb = b.getTime();
104
104
  /* istanbul ignore next -- _validateKey prevents invalid Date from entering the tree */
105
- if (Number.isNaN(ta) || Number.isNaN(tb)) throw new TypeError(ERR.invalidDate('TreeMap'));
105
+ if (Number.isNaN(ta) || Number.isNaN(tb)) raise(TypeError, ERR.invalidDate('TreeMap'));
106
106
  return ta > tb ? 1 : ta < tb ? -1 : 0;
107
107
  }
108
108
 
109
- throw new TypeError(ERR.comparatorRequired('TreeMap'));
109
+ raise(TypeError, ERR.comparatorRequired('TreeMap'));
110
110
  };
111
111
  }
112
112
 
@@ -114,18 +114,18 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
114
114
  if (!this.#isDefaultComparator) return;
115
115
 
116
116
  if (typeof key === 'number') {
117
- if (Number.isNaN(key)) throw new TypeError(ERR.invalidNaN('TreeMap'));
117
+ if (Number.isNaN(key)) raise(TypeError, ERR.invalidNaN('TreeMap'));
118
118
  return;
119
119
  }
120
120
 
121
121
  if (typeof key === 'string') return;
122
122
 
123
123
  if (key instanceof Date) {
124
- if (Number.isNaN(key.getTime())) throw new TypeError(ERR.invalidDate('TreeMap'));
124
+ if (Number.isNaN(key.getTime())) raise(TypeError, ERR.invalidDate('TreeMap'));
125
125
  return;
126
126
  }
127
127
 
128
- throw new TypeError(ERR.comparatorRequired('TreeMap'));
128
+ raise(TypeError, ERR.comparatorRequired('TreeMap'));
129
129
  }
130
130
 
131
131
  /**
@@ -180,17 +180,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
180
180
 
181
181
 
182
182
 
183
- * @example
184
- * // Check empty
185
- * console.log(new TreeMap().isEmpty()); // true;
186
- */
187
- isEmpty(): boolean {
188
- return this.size === 0;
189
- }
190
-
191
- /**
192
- * Set or overwrite a value for a key.
193
- * @remarks Expected time O(log n)
194
183
 
195
184
 
196
185
 
@@ -243,36 +232,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
243
232
 
244
233
 
245
234
 
246
- * @example
247
- * // Sorted dictionary for a contact book
248
- * const contacts = new TreeMap<string, string>([
249
- * ['Bob', '555-0102'],
250
- * ['Alice', '555-0101'],
251
- * ['Charlie', '555-0103']
252
- * ]);
253
- *
254
- * // Contacts are automatically sorted by name
255
- * console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
256
- * console.log(contacts.get('Bob')); // '555-0102';
257
- *
258
- * // Find the first contact alphabetically after 'B'
259
- * console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
260
- *
261
- * // Find contacts in range
262
- * console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
263
- * // ['Alice', '555-0101'],
264
- * // ['Bob', '555-0102']
265
- * // ];
266
- */
267
- set(key: K, value: V | undefined): this {
268
- this._validateKey(key);
269
- this.#core.set(key, value as V);
270
- return this;
271
- }
272
-
273
- /**
274
- * Get the value under a key.
275
- * @remarks Expected time O(log n)
235
+
236
+
237
+
238
+
239
+
240
+
241
+
242
+
243
+
276
244
 
277
245
 
278
246
 
@@ -328,24 +296,15 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
328
296
 
329
297
 
330
298
  * @example
331
- * // Configuration registry with typed lookups
332
- * const config = new TreeMap<string, number>([
333
- * ['maxRetries', 3],
334
- * ['timeout', 5000],
335
- * ['poolSize', 10]
336
- * ]);
337
- *
338
- * console.log(config.get('timeout')); // 5000;
339
- * console.log(config.get('missing')); // undefined;
340
- * console.log(config.size); // 3;
299
+ * // Check empty
300
+ * console.log(new TreeMap().isEmpty()); // true;
341
301
  */
342
- get(key: K): V | undefined {
343
- this._validateKey(key);
344
- return this.#core.get(key);
302
+ isEmpty(): boolean {
303
+ return this.size === 0;
345
304
  }
346
305
 
347
306
  /**
348
- * Test whether a key exists.
307
+ * Set or overwrite a value for a key.
349
308
  * @remarks Expected time O(log n)
350
309
 
351
310
 
@@ -401,26 +360,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
401
360
 
402
361
 
403
362
 
404
- * @example
405
- * // Feature flag checking
406
- * const flags = new TreeMap<string, boolean>([
407
- * ['darkMode', true],
408
- * ['betaFeature', false],
409
- * ['notifications', true]
410
- * ]);
411
- *
412
- * console.log(flags.has('darkMode')); // true;
413
- * console.log(flags.has('unknownFlag')); // false;
414
- */
415
- has(key: K): boolean {
416
- this._validateKey(key);
417
- return this.#core.has(key);
418
- }
419
-
420
- /**
421
- * Delete a key.
422
- * @returns `true` if the key existed; otherwise `false`.
423
- * @remarks Expected time O(log n)
424
363
 
425
364
 
426
365
 
@@ -475,27 +414,22 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
475
414
 
476
415
 
477
416
 
478
- * @example
479
- * // Session management with expiry
480
- * const sessions = new TreeMap<string, number>([
481
- * ['sess_abc', Date.now()],
482
- * ['sess_def', Date.now()],
483
- * ['sess_ghi', Date.now()]
484
- * ]);
485
- *
486
- * console.log(sessions.size); // 3;
487
- * sessions.delete('sess_def');
488
- * console.log(sessions.has('sess_def')); // false;
489
- * console.log(sessions.size); // 2;
490
- */
491
- delete(key: K): boolean {
492
- this._validateKey(key);
493
- const res = this.#core.delete(key);
494
- return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
495
- }
496
-
497
- /**
498
- * Remove all entries.
417
+
418
+
419
+
420
+
421
+
422
+
423
+
424
+
425
+
426
+
427
+
428
+
429
+
430
+
431
+
432
+
499
433
 
500
434
 
501
435
 
@@ -540,20 +474,35 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
540
474
 
541
475
 
542
476
  * @example
543
- * // Remove all
544
- * const tm = new TreeMap<number, string>([[1, 'a']]);
545
- * tm.clear();
546
- * console.log(tm.isEmpty()); // true;
477
+ * // Sorted dictionary for a contact book
478
+ * const contacts = new TreeMap<string, string>([
479
+ * ['Bob', '555-0102'],
480
+ * ['Alice', '555-0101'],
481
+ * ['Charlie', '555-0103']
482
+ * ]);
483
+ *
484
+ * // Contacts are automatically sorted by name
485
+ * console.log([...contacts.keys()]); // ['Alice', 'Bob', 'Charlie'];
486
+ * console.log(contacts.get('Bob')); // '555-0102';
487
+ *
488
+ * // Find the first contact alphabetically after 'B'
489
+ * console.log(contacts.ceiling('B')); // ['Bob', '555-0102'];
490
+ *
491
+ * // Find contacts in range
492
+ * console.log(contacts.rangeSearch(['Alice', 'Bob'])); // [
493
+ * // ['Alice', '555-0101'],
494
+ * // ['Bob', '555-0102']
495
+ * // ];
547
496
  */
548
- clear(): void {
549
- this.#core.clear();
497
+ set(key: K, value: V | undefined): this {
498
+ this._validateKey(key);
499
+ this.#core.set(key, value as V);
500
+ return this;
550
501
  }
551
502
 
552
503
  /**
553
- * Iterate over keys in ascending order.
554
-
555
-
556
-
504
+ * Get the value under a key.
505
+ * @remarks Expected time O(log n)
557
506
 
558
507
 
559
508
 
@@ -594,25 +543,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
594
543
 
595
544
 
596
545
 
597
- * @example
598
- * // Get sorted keys
599
- * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
600
- * console.log([...tm.keys()]); // [1, 3];
601
- */
602
- keys(): IterableIterator<K> {
603
- return this.#core.keys();
604
- }
605
-
606
- private _entryFromKey(k: K): [K, V | undefined] {
607
- // Keys come from `keys()` which only yields existing keys.
608
- // We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
609
- return [k, this.#core.get(k)];
610
- }
611
-
612
- /**
613
- * Iterate over values in ascending key order.
614
- *
615
- * Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
616
546
 
617
547
 
618
548
 
@@ -656,19 +586,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
656
586
 
657
587
 
658
588
 
659
- * @example
660
- * // Get values in key order
661
- * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
662
- * console.log([...tm.values()]); // ['a', 'b'];
663
- */
664
- *values(): IterableIterator<V | undefined> {
665
- for (const k of this.keys()) yield this._entryFromKey(k)[1];
666
- }
667
-
668
- /**
669
- * Iterate over `[key, value]` entries in ascending key order.
670
- *
671
- * Note: values may be `undefined`.
672
589
 
673
590
 
674
591
 
@@ -712,23 +629,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
712
629
 
713
630
 
714
631
 
715
- * @example
716
- * // Iterate key-value pairs
717
- * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
718
- * console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
719
- */
720
- *entries(): IterableIterator<[K, V | undefined]> {
721
- for (const k of this.keys()) yield this._entryFromKey(k);
722
- }
723
-
724
- [Symbol.iterator](): IterableIterator<[K, V | undefined]> {
725
- return this.entries();
726
- }
727
-
728
- /**
729
- * Visit each entry in ascending key order.
730
- *
731
- * Note: callback value may be `undefined`.
732
632
 
733
633
 
734
634
 
@@ -773,21 +673,25 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
773
673
 
774
674
 
775
675
  * @example
776
- * // Execute for each entry
777
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
778
- * const pairs: string[] = [];
779
- * tm.forEach((v, k) => pairs.push(`${k}:${v}`));
780
- * console.log(pairs); // ['1:a', '2:b'];
676
+ * // Configuration registry with typed lookups
677
+ * const config = new TreeMap<string, number>([
678
+ * ['maxRetries', 3],
679
+ * ['timeout', 5000],
680
+ * ['poolSize', 10]
681
+ * ]);
682
+ *
683
+ * console.log(config.get('timeout')); // 5000;
684
+ * console.log(config.get('missing')); // undefined;
685
+ * console.log(config.size); // 3;
781
686
  */
782
- forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: any): void {
783
- for (const [k, v] of this) cb.call(thisArg, v, k, this);
687
+ get(key: K): V | undefined {
688
+ this._validateKey(key);
689
+ return this.#core.get(key);
784
690
  }
785
691
 
786
692
  /**
787
- * Create a new TreeMap by mapping each entry to a new `[key, value]` entry.
788
- *
789
- * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
790
- * @remarks Time O(n log n) expected, Space O(n)
693
+ * Test whether a key exists.
694
+ * @remarks Expected time O(log n)
791
695
 
792
696
 
793
697
 
@@ -831,31 +735,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
831
735
 
832
736
 
833
737
 
834
- * @example
835
- * // Transform entries
836
- * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
837
- * const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
838
- * console.log([...doubled.values()]); // [20, 40];
839
- */
840
- map<MK, MV>(
841
- callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
842
- options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
843
- thisArg?: unknown
844
- ): TreeMap<MK, MV> {
845
- const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
846
- let index = 0;
847
- for (const [k, v] of this) {
848
- const [mk, mv] = thisArg === undefined
849
- ? callbackfn(v, k, index++, this)
850
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
851
- out.set(mk, mv);
852
- }
853
- return out;
854
- }
855
-
856
- /**
857
- * Create a new TreeMap containing only entries that satisfy the predicate.
858
- * @remarks Time O(n log n) expected, Space O(n)
859
738
 
860
739
 
861
740
 
@@ -899,28 +778,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
899
778
 
900
779
 
901
780
 
902
- * @example
903
- * // Filter entries
904
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
905
- * const filtered = tm.filter((v, k) => k > 1);
906
- * console.log([...filtered.keys()]); // [2, 3];
907
- */
908
- filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
909
- const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
910
- let index = 0;
911
- for (const [k, v] of this) {
912
- const ok = thisArg === undefined
913
- ? callbackfn(v, k, index++, this)
914
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
915
- if (ok) out.set(k, v);
916
- }
917
- return out;
918
- }
919
-
920
- /**
921
- * Reduce entries into a single accumulator.
922
- * @remarks Time O(n), Space O(1)
923
-
924
781
 
925
782
 
926
783
 
@@ -963,21 +820,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
963
820
 
964
821
 
965
822
 
966
- * @example
967
- * // Aggregate values
968
- * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
969
- * console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
970
- */
971
- reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
972
- let acc = initialValue;
973
- let index = 0;
974
- for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
975
- return acc;
976
- }
977
-
978
- /**
979
- * Test whether all entries satisfy a predicate.
980
- * @remarks Time O(n), Space O(1)
981
823
 
982
824
 
983
825
 
@@ -1020,24 +862,26 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1020
862
 
1021
863
 
1022
864
  * @example
1023
- * // Test all entries
1024
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1025
- * console.log(tm.every((v, k) => k > 0)); // true;
865
+ * // Feature flag checking
866
+ * const flags = new TreeMap<string, boolean>([
867
+ * ['darkMode', true],
868
+ * ['betaFeature', false],
869
+ * ['notifications', true]
870
+ * ]);
871
+ *
872
+ * console.log(flags.has('darkMode')); // true;
873
+ * console.log(flags.has('unknownFlag')); // false;
1026
874
  */
1027
- every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
1028
- let index = 0;
1029
- for (const [k, v] of this) {
1030
- const ok = thisArg === undefined
1031
- ? callbackfn(v, k, index++, this)
1032
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
1033
- if (!ok) return false;
1034
- }
1035
- return true;
875
+ has(key: K): boolean {
876
+ this._validateKey(key);
877
+ return this.#core.has(key);
1036
878
  }
1037
879
 
1038
880
  /**
1039
- * Test whether any entry satisfies a predicate.
1040
- * @remarks Time O(n), Space O(1)
881
+ * Delete a key.
882
+ * @returns `true` if the key existed; otherwise `false`.
883
+ * @remarks Expected time O(log n)
884
+
1041
885
 
1042
886
 
1043
887
 
@@ -1079,26 +923,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1079
923
 
1080
924
 
1081
925
 
1082
- * @example
1083
- * // Test any entry
1084
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1085
- * console.log(tm.some((v, k) => k === 2)); // true;
1086
- */
1087
- some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
1088
- let index = 0;
1089
- for (const [k, v] of this) {
1090
- const ok = thisArg === undefined
1091
- ? callbackfn(v, k, index++, this)
1092
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
1093
- if (ok) return true;
1094
- }
1095
- return false;
1096
- }
1097
-
1098
- /**
1099
- * Find the first entry that satisfies a predicate.
1100
- * @returns The first matching `[key, value]` tuple, or `undefined`.
1101
- * @remarks Time O(n), Space O(1)
1102
926
 
1103
927
 
1104
928
 
@@ -1140,25 +964,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1140
964
 
1141
965
 
1142
966
 
1143
- * @example
1144
- * // Find matching entry
1145
- * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1146
- * console.log(tm.find(v => v === 'b')?.[0]); // 2;
1147
- */
1148
- find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
1149
- let index = 0;
1150
- for (const [k, v] of this) {
1151
- const ok = thisArg === undefined
1152
- ? callbackfn(v, k, index++, this)
1153
- : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
1154
- if (ok) return [k, v];
1155
- }
1156
- return undefined;
1157
- }
1158
-
1159
- /**
1160
- * Materialize the map into an array of `[key, value]` tuples.
1161
- * @remarks Time O(n), Space O(n)
1162
967
 
1163
968
 
1164
969
 
@@ -1202,18 +1007,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1202
1007
 
1203
1008
 
1204
1009
 
1205
- * @example
1206
- * // Convert to array
1207
- * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
1208
- * console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
1209
- */
1210
- toArray(): Array<[K, V | undefined]> {
1211
- return [...this];
1212
- }
1213
-
1214
- /**
1215
- * Print a human-friendly representation.
1216
- * @remarks Time O(n), Space O(n)
1217
1010
 
1218
1011
 
1219
1012
 
@@ -1258,20 +1051,26 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1258
1051
 
1259
1052
 
1260
1053
  * @example
1261
- * // Display tree
1262
- * const tm = new TreeMap<number, string>([[1, 'a']]);
1263
- * expect(() => tm.print()).not.toThrow();
1054
+ * // Session management with expiry
1055
+ * const sessions = new TreeMap<string, number>([
1056
+ * ['sess_abc', Date.now()],
1057
+ * ['sess_def', Date.now()],
1058
+ * ['sess_ghi', Date.now()]
1059
+ * ]);
1060
+ *
1061
+ * console.log(sessions.size); // 3;
1062
+ * sessions.delete('sess_def');
1063
+ * console.log(sessions.has('sess_def')); // false;
1064
+ * console.log(sessions.size); // 2;
1264
1065
  */
1265
- print(): void {
1266
- // Delegate to the underlying tree's visualization.
1267
- this.#core.print();
1066
+ delete(key: K): boolean {
1067
+ this._validateKey(key);
1068
+ const res = this.#core.delete(key);
1069
+ return Array.isArray(res) && res.length > 0 && !!res[0]?.deleted;
1268
1070
  }
1269
1071
 
1270
- // Navigable operations (return entry tuples)
1271
- // Note: returned tuple values may be `undefined`.
1272
-
1273
1072
  /**
1274
- * Smallest entry by key.
1073
+ * Remove all entries.
1275
1074
 
1276
1075
 
1277
1076
 
@@ -1284,40 +1083,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1284
1083
 
1285
1084
 
1286
1085
 
1287
- * @example
1288
- * // Leaderboard with ranked scores
1289
- * // Use score as key (descending), player name as value
1290
- * const leaderboard = new TreeMap<number, string>([], {
1291
- * comparator: (a, b) => b - a // descending
1292
- * });
1293
- *
1294
- * leaderboard.set(1500, 'Alice');
1295
- * leaderboard.set(2200, 'Bob');
1296
- * leaderboard.set(1800, 'Charlie');
1297
- * leaderboard.set(2500, 'Diana');
1298
- *
1299
- * // Top 3 players (first 3 in descending order)
1300
- * const top3 = [...leaderboard.entries()].slice(0, 3);
1301
- * console.log(top3); // [
1302
- * // [2500, 'Diana'],
1303
- * // [2200, 'Bob'],
1304
- * // [1800, 'Charlie']
1305
- * // ];
1306
- *
1307
- * // Highest scorer
1308
- * console.log(leaderboard.first()); // [2500, 'Diana'];
1309
- *
1310
- * // Remove lowest scorer
1311
- * console.log(leaderboard.pollLast()); // [1500, 'Alice'];
1312
- * console.log(leaderboard.size); // 3;
1313
- */
1314
- first(): [K, V | undefined] | undefined {
1315
- const k = this.#core.getLeftMost();
1316
- return k === undefined ? undefined : this._entryFromKey(k);
1317
- }
1318
-
1319
- /**
1320
- * Largest entry by key.
1321
1086
 
1322
1087
 
1323
1088
 
@@ -1330,24 +1095,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1330
1095
 
1331
1096
 
1332
1097
 
1333
- * @example
1334
- * // Access the maximum entry
1335
- * const scores = new TreeMap<number, string>([
1336
- * [85, 'Bob'],
1337
- * [92, 'Alice'],
1338
- * [78, 'Charlie']
1339
- * ]);
1340
- *
1341
- * console.log(scores.last()); // [92, 'Alice'];
1342
- * console.log(scores.first()); // [78, 'Charlie'];
1343
- */
1344
- last(): [K, V | undefined] | undefined {
1345
- const k = this.#core.getRightMost();
1346
- return k === undefined ? undefined : this._entryFromKey(k);
1347
- }
1348
-
1349
- /**
1350
- * Remove and return the smallest entry.
1351
1098
 
1352
1099
 
1353
1100
 
@@ -1360,28 +1107,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1360
1107
 
1361
1108
 
1362
1109
 
1363
- * @example
1364
- * // Process items from lowest priority
1365
- * const tasks = new TreeMap<number, string>([
1366
- * [3, 'Low'],
1367
- * [1, 'Critical'],
1368
- * [2, 'Medium']
1369
- * ]);
1370
- *
1371
- * // Process lowest priority first
1372
- * console.log(tasks.pollFirst()); // [1, 'Critical'];
1373
- * console.log(tasks.pollFirst()); // [2, 'Medium'];
1374
- * console.log(tasks.size); // 1;
1375
- */
1376
- pollFirst(): [K, V | undefined] | undefined {
1377
- const entry = this.first();
1378
- if (!entry) return undefined;
1379
- this.delete(entry[0]);
1380
- return entry;
1381
- }
1382
-
1383
- /**
1384
- * Remove and return the largest entry.
1385
1110
 
1386
1111
 
1387
1112
 
@@ -1394,28 +1119,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1394
1119
 
1395
1120
 
1396
1121
 
1397
- * @example
1398
- * // Remove the maximum entry
1399
- * const bids = new TreeMap<number, string>([
1400
- * [100, 'Alice'],
1401
- * [150, 'Bob'],
1402
- * [120, 'Charlie']
1403
- * ]);
1404
- *
1405
- * // Remove highest bid
1406
- * console.log(bids.pollLast()); // [150, 'Bob'];
1407
- * console.log(bids.size); // 2;
1408
- * console.log(bids.last()); // [120, 'Charlie'];
1409
- */
1410
- pollLast(): [K, V | undefined] | undefined {
1411
- const entry = this.last();
1412
- if (!entry) return undefined;
1413
- this.delete(entry[0]);
1414
- return entry;
1415
- }
1416
-
1417
- /**
1418
- * Smallest entry whose key is >= the given key.
1419
1122
 
1420
1123
 
1421
1124
 
@@ -1458,18 +1161,2569 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1458
1161
 
1459
1162
 
1460
1163
 
1461
- * @example
1462
- * // Event scheduler with time-based lookup
1463
- * const events = new TreeMap<Date, string>();
1464
- *
1465
- * const meeting = new Date('2024-01-15T10:00:00Z');
1466
- * const lunch = new Date('2024-01-15T12:00:00Z');
1467
- * const review = new Date('2024-01-15T15:00:00Z');
1468
- * const standup = new Date('2024-01-15T09:00:00Z');
1469
- *
1470
- * events.set(meeting, 'Team Meeting');
1471
- * events.set(lunch, 'Lunch Break');
1472
- * events.set(review, 'Code Review');
1164
+
1165
+
1166
+
1167
+
1168
+
1169
+
1170
+
1171
+
1172
+
1173
+
1174
+
1175
+
1176
+
1177
+
1178
+
1179
+
1180
+
1181
+
1182
+
1183
+
1184
+
1185
+
1186
+
1187
+
1188
+
1189
+
1190
+
1191
+
1192
+
1193
+
1194
+
1195
+
1196
+
1197
+
1198
+
1199
+
1200
+
1201
+
1202
+
1203
+
1204
+
1205
+
1206
+
1207
+
1208
+
1209
+
1210
+
1211
+
1212
+
1213
+
1214
+
1215
+
1216
+
1217
+
1218
+
1219
+
1220
+
1221
+
1222
+
1223
+
1224
+
1225
+
1226
+
1227
+
1228
+
1229
+
1230
+
1231
+
1232
+ * @example
1233
+ * // Remove all
1234
+ * const tm = new TreeMap<number, string>([[1, 'a']]);
1235
+ * tm.clear();
1236
+ * console.log(tm.isEmpty()); // true;
1237
+ */
1238
+ clear(): void {
1239
+ this.#core.clear();
1240
+ }
1241
+
1242
+ /**
1243
+ * Iterate over keys in ascending order.
1244
+
1245
+
1246
+
1247
+
1248
+
1249
+
1250
+
1251
+
1252
+
1253
+
1254
+
1255
+
1256
+
1257
+
1258
+
1259
+
1260
+
1261
+
1262
+
1263
+
1264
+
1265
+
1266
+
1267
+
1268
+
1269
+
1270
+
1271
+
1272
+
1273
+
1274
+
1275
+
1276
+
1277
+
1278
+
1279
+
1280
+
1281
+
1282
+
1283
+
1284
+
1285
+
1286
+
1287
+
1288
+
1289
+
1290
+
1291
+
1292
+
1293
+
1294
+
1295
+
1296
+
1297
+
1298
+
1299
+
1300
+
1301
+
1302
+
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+
1309
+
1310
+
1311
+
1312
+
1313
+
1314
+
1315
+
1316
+
1317
+
1318
+
1319
+
1320
+
1321
+
1322
+
1323
+
1324
+
1325
+
1326
+
1327
+
1328
+
1329
+
1330
+
1331
+
1332
+
1333
+
1334
+
1335
+
1336
+
1337
+
1338
+
1339
+
1340
+
1341
+
1342
+
1343
+
1344
+
1345
+
1346
+
1347
+
1348
+
1349
+
1350
+
1351
+
1352
+
1353
+
1354
+
1355
+
1356
+
1357
+
1358
+
1359
+
1360
+
1361
+
1362
+
1363
+
1364
+
1365
+
1366
+
1367
+
1368
+
1369
+
1370
+
1371
+
1372
+
1373
+
1374
+
1375
+
1376
+
1377
+
1378
+
1379
+
1380
+
1381
+
1382
+
1383
+
1384
+
1385
+
1386
+
1387
+
1388
+
1389
+
1390
+
1391
+
1392
+
1393
+
1394
+
1395
+
1396
+
1397
+
1398
+
1399
+
1400
+
1401
+
1402
+ * @example
1403
+ * // Get sorted keys
1404
+ * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a']]);
1405
+ * console.log([...tm.keys()]); // [1, 3];
1406
+ */
1407
+ keys(): IterableIterator<K> {
1408
+ return this.#core.keys();
1409
+ }
1410
+
1411
+ private _entryFromKey(k: K): [K, V | undefined] {
1412
+ // Keys come from `keys()` which only yields existing keys.
1413
+ // We allow `undefined` as a stored value (native Map behavior), so entries are typed as `[K, V | undefined]`.
1414
+ return [k, this.#core.get(k)];
1415
+ }
1416
+
1417
+ /**
1418
+ * Iterate over values in ascending key order.
1419
+ *
1420
+ * Note: values may be `undefined` (TreeMap allows storing `undefined`, like native `Map`).
1421
+
1422
+
1423
+
1424
+
1425
+
1426
+
1427
+
1428
+
1429
+
1430
+
1431
+
1432
+
1433
+
1434
+
1435
+
1436
+
1437
+
1438
+
1439
+
1440
+
1441
+
1442
+
1443
+
1444
+
1445
+
1446
+
1447
+
1448
+
1449
+
1450
+
1451
+
1452
+
1453
+
1454
+
1455
+
1456
+
1457
+
1458
+
1459
+
1460
+
1461
+
1462
+
1463
+
1464
+
1465
+
1466
+
1467
+
1468
+
1469
+
1470
+
1471
+
1472
+
1473
+
1474
+
1475
+
1476
+
1477
+
1478
+
1479
+
1480
+
1481
+
1482
+
1483
+
1484
+
1485
+
1486
+
1487
+
1488
+
1489
+
1490
+
1491
+
1492
+
1493
+
1494
+
1495
+
1496
+
1497
+
1498
+
1499
+
1500
+
1501
+
1502
+
1503
+
1504
+
1505
+
1506
+
1507
+
1508
+
1509
+
1510
+
1511
+
1512
+
1513
+
1514
+
1515
+
1516
+
1517
+
1518
+
1519
+
1520
+
1521
+
1522
+
1523
+
1524
+
1525
+
1526
+
1527
+
1528
+
1529
+
1530
+
1531
+
1532
+
1533
+
1534
+
1535
+
1536
+
1537
+
1538
+
1539
+
1540
+
1541
+
1542
+
1543
+
1544
+
1545
+
1546
+
1547
+
1548
+
1549
+
1550
+
1551
+
1552
+
1553
+
1554
+
1555
+
1556
+
1557
+
1558
+
1559
+
1560
+
1561
+
1562
+
1563
+
1564
+
1565
+
1566
+
1567
+
1568
+
1569
+
1570
+
1571
+
1572
+
1573
+
1574
+
1575
+
1576
+
1577
+
1578
+
1579
+ * @example
1580
+ * // Get values in key order
1581
+ * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
1582
+ * console.log([...tm.values()]); // ['a', 'b'];
1583
+ */
1584
+ *values(): IterableIterator<V | undefined> {
1585
+ for (const k of this.keys()) yield this._entryFromKey(k)[1];
1586
+ }
1587
+
1588
+ /**
1589
+ * Iterate over `[key, value]` entries in ascending key order.
1590
+ *
1591
+ * Note: values may be `undefined`.
1592
+
1593
+
1594
+
1595
+
1596
+
1597
+
1598
+
1599
+
1600
+
1601
+
1602
+
1603
+
1604
+
1605
+
1606
+
1607
+
1608
+
1609
+
1610
+
1611
+
1612
+
1613
+
1614
+
1615
+
1616
+
1617
+
1618
+
1619
+
1620
+
1621
+
1622
+
1623
+
1624
+
1625
+
1626
+
1627
+
1628
+
1629
+
1630
+
1631
+
1632
+
1633
+
1634
+
1635
+
1636
+
1637
+
1638
+
1639
+
1640
+
1641
+
1642
+
1643
+
1644
+
1645
+
1646
+
1647
+
1648
+
1649
+
1650
+
1651
+
1652
+
1653
+
1654
+
1655
+
1656
+
1657
+
1658
+
1659
+
1660
+
1661
+
1662
+
1663
+
1664
+
1665
+
1666
+
1667
+
1668
+
1669
+
1670
+
1671
+
1672
+
1673
+
1674
+
1675
+
1676
+
1677
+
1678
+
1679
+
1680
+
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+
1687
+
1688
+
1689
+
1690
+
1691
+
1692
+
1693
+
1694
+
1695
+
1696
+
1697
+
1698
+
1699
+
1700
+
1701
+
1702
+
1703
+
1704
+
1705
+
1706
+
1707
+
1708
+
1709
+
1710
+
1711
+
1712
+
1713
+
1714
+
1715
+
1716
+
1717
+
1718
+
1719
+
1720
+
1721
+
1722
+
1723
+
1724
+
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+
1731
+
1732
+
1733
+
1734
+
1735
+
1736
+
1737
+
1738
+
1739
+
1740
+
1741
+
1742
+
1743
+
1744
+
1745
+
1746
+
1747
+
1748
+
1749
+
1750
+ * @example
1751
+ * // Iterate key-value pairs
1752
+ * const tm = new TreeMap<number, string>([[3, 'c'], [1, 'a'], [2, 'b']]);
1753
+ * console.log([...tm.entries()]); // [[1, 'a'], [2, 'b'], [3, 'c']];
1754
+ */
1755
+ *entries(): IterableIterator<[K, V | undefined]> {
1756
+ for (const k of this.keys()) yield this._entryFromKey(k);
1757
+ }
1758
+
1759
+ [Symbol.iterator](): IterableIterator<[K, V | undefined]> {
1760
+ return this.entries();
1761
+ }
1762
+
1763
+ /**
1764
+ * Visit each entry in ascending key order.
1765
+ *
1766
+ * Note: callback value may be `undefined`.
1767
+
1768
+
1769
+
1770
+
1771
+
1772
+
1773
+
1774
+
1775
+
1776
+
1777
+
1778
+
1779
+
1780
+
1781
+
1782
+
1783
+
1784
+
1785
+
1786
+
1787
+
1788
+
1789
+
1790
+
1791
+
1792
+
1793
+
1794
+
1795
+
1796
+
1797
+
1798
+
1799
+
1800
+
1801
+
1802
+
1803
+
1804
+
1805
+
1806
+
1807
+
1808
+
1809
+
1810
+
1811
+
1812
+
1813
+
1814
+
1815
+
1816
+
1817
+
1818
+
1819
+
1820
+
1821
+
1822
+
1823
+
1824
+
1825
+
1826
+
1827
+
1828
+
1829
+
1830
+
1831
+
1832
+
1833
+
1834
+
1835
+
1836
+
1837
+
1838
+
1839
+
1840
+
1841
+
1842
+
1843
+
1844
+
1845
+
1846
+
1847
+
1848
+
1849
+
1850
+
1851
+
1852
+
1853
+
1854
+
1855
+
1856
+
1857
+
1858
+
1859
+
1860
+
1861
+
1862
+
1863
+
1864
+
1865
+
1866
+
1867
+
1868
+
1869
+
1870
+
1871
+
1872
+
1873
+
1874
+
1875
+
1876
+
1877
+
1878
+
1879
+
1880
+
1881
+
1882
+
1883
+
1884
+
1885
+
1886
+
1887
+
1888
+
1889
+
1890
+
1891
+
1892
+
1893
+
1894
+
1895
+
1896
+
1897
+
1898
+
1899
+
1900
+
1901
+
1902
+
1903
+
1904
+
1905
+
1906
+
1907
+
1908
+
1909
+
1910
+
1911
+
1912
+
1913
+
1914
+
1915
+
1916
+
1917
+
1918
+
1919
+
1920
+
1921
+
1922
+
1923
+
1924
+
1925
+ * @example
1926
+ * // Execute for each entry
1927
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
1928
+ * const pairs: string[] = [];
1929
+ * tm.forEach((v, k) => pairs.push(`${k}:${v}`));
1930
+ * console.log(pairs); // ['1:a', '2:b'];
1931
+ */
1932
+ forEach(cb: (value: V | undefined, key: K, map: TreeMap<K, V>) => void, thisArg?: unknown): void {
1933
+ for (const [k, v] of this) cb.call(thisArg, v, k, this);
1934
+ }
1935
+
1936
+ /**
1937
+ * Create a new TreeMap by mapping each entry to a new `[key, value]` entry.
1938
+ *
1939
+ * This mirrors `RedBlackTree.map`: mapping produces a new ordered container.
1940
+ * @remarks Time O(n log n) expected, Space O(n)
1941
+
1942
+
1943
+
1944
+
1945
+
1946
+
1947
+
1948
+
1949
+
1950
+
1951
+
1952
+
1953
+
1954
+
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+
1961
+
1962
+
1963
+
1964
+
1965
+
1966
+
1967
+
1968
+
1969
+
1970
+
1971
+
1972
+
1973
+
1974
+
1975
+
1976
+
1977
+
1978
+
1979
+
1980
+
1981
+
1982
+
1983
+
1984
+
1985
+
1986
+
1987
+
1988
+
1989
+
1990
+
1991
+
1992
+
1993
+
1994
+
1995
+
1996
+
1997
+
1998
+
1999
+
2000
+
2001
+
2002
+
2003
+
2004
+
2005
+
2006
+
2007
+
2008
+
2009
+
2010
+
2011
+
2012
+
2013
+
2014
+
2015
+
2016
+
2017
+
2018
+
2019
+
2020
+
2021
+
2022
+
2023
+
2024
+
2025
+
2026
+
2027
+
2028
+
2029
+
2030
+
2031
+
2032
+
2033
+
2034
+
2035
+
2036
+
2037
+
2038
+
2039
+
2040
+
2041
+
2042
+
2043
+
2044
+
2045
+
2046
+
2047
+
2048
+
2049
+
2050
+
2051
+
2052
+
2053
+
2054
+
2055
+
2056
+
2057
+
2058
+
2059
+
2060
+
2061
+
2062
+
2063
+
2064
+
2065
+
2066
+
2067
+
2068
+
2069
+
2070
+
2071
+
2072
+
2073
+
2074
+
2075
+
2076
+
2077
+
2078
+
2079
+
2080
+
2081
+
2082
+
2083
+
2084
+
2085
+
2086
+
2087
+
2088
+
2089
+
2090
+
2091
+
2092
+
2093
+
2094
+
2095
+
2096
+
2097
+
2098
+
2099
+ * @example
2100
+ * // Transform entries
2101
+ * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
2102
+ * const doubled = tm.map((v, k) => [k, (v ?? 0) * 2] as [number, number]);
2103
+ * console.log([...doubled.values()]); // [20, 40];
2104
+ */
2105
+ map<MK, MV>(
2106
+ callbackfn: TreeMapEntryCallback<K, V, [MK, MV], TreeMap<K, V>>,
2107
+ options: Omit<TreeMapOptions<MK, MV>, 'toEntryFn'> & { comparator?: (a: MK, b: MK) => number } = {},
2108
+ thisArg?: unknown
2109
+ ): TreeMap<MK, MV> {
2110
+ const out = new TreeMap<MK, MV>([], options as TreeMapOptions<MK, MV>);
2111
+ let index = 0;
2112
+ for (const [k, v] of this) {
2113
+ const [mk, mv] = thisArg === undefined
2114
+ ? callbackfn(v, k, index++, this)
2115
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => [MK, MV]).call(thisArg, v, k, index++, this);
2116
+ out.set(mk, mv);
2117
+ }
2118
+ return out;
2119
+ }
2120
+
2121
+ /**
2122
+ * Create a new TreeMap containing only entries that satisfy the predicate.
2123
+ * @remarks Time O(n log n) expected, Space O(n)
2124
+
2125
+
2126
+
2127
+
2128
+
2129
+
2130
+
2131
+
2132
+
2133
+
2134
+
2135
+
2136
+
2137
+
2138
+
2139
+
2140
+
2141
+
2142
+
2143
+
2144
+
2145
+
2146
+
2147
+
2148
+
2149
+
2150
+
2151
+
2152
+
2153
+
2154
+
2155
+
2156
+
2157
+
2158
+
2159
+
2160
+
2161
+
2162
+
2163
+
2164
+
2165
+
2166
+
2167
+
2168
+
2169
+
2170
+
2171
+
2172
+
2173
+
2174
+
2175
+
2176
+
2177
+
2178
+
2179
+
2180
+
2181
+
2182
+
2183
+
2184
+
2185
+
2186
+
2187
+
2188
+
2189
+
2190
+
2191
+
2192
+
2193
+
2194
+
2195
+
2196
+
2197
+
2198
+
2199
+
2200
+
2201
+
2202
+
2203
+
2204
+
2205
+
2206
+
2207
+
2208
+
2209
+
2210
+
2211
+
2212
+
2213
+
2214
+
2215
+
2216
+
2217
+
2218
+
2219
+
2220
+
2221
+
2222
+
2223
+
2224
+
2225
+
2226
+
2227
+
2228
+
2229
+
2230
+
2231
+
2232
+
2233
+
2234
+
2235
+
2236
+
2237
+
2238
+
2239
+
2240
+
2241
+
2242
+
2243
+
2244
+
2245
+
2246
+
2247
+
2248
+
2249
+
2250
+
2251
+
2252
+
2253
+
2254
+
2255
+
2256
+
2257
+
2258
+
2259
+
2260
+
2261
+
2262
+
2263
+
2264
+
2265
+
2266
+
2267
+
2268
+
2269
+
2270
+
2271
+
2272
+
2273
+
2274
+
2275
+
2276
+
2277
+
2278
+
2279
+
2280
+
2281
+
2282
+ * @example
2283
+ * // Filter entries
2284
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b'], [3, 'c']]);
2285
+ * const filtered = tm.filter((v, k) => k > 1);
2286
+ * console.log([...filtered.keys()]); // [2, 3];
2287
+ */
2288
+ filter(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): TreeMap<K, V> {
2289
+ const out = new TreeMap<K, V>([], { comparator: this.#userComparator });
2290
+ let index = 0;
2291
+ for (const [k, v] of this) {
2292
+ const ok = thisArg === undefined
2293
+ ? callbackfn(v, k, index++, this)
2294
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2295
+ if (ok) out.set(k, v);
2296
+ }
2297
+ return out;
2298
+ }
2299
+
2300
+ /**
2301
+ * Reduce entries into a single accumulator.
2302
+ * @remarks Time O(n), Space O(1)
2303
+
2304
+
2305
+
2306
+
2307
+
2308
+
2309
+
2310
+
2311
+
2312
+
2313
+
2314
+
2315
+
2316
+
2317
+
2318
+
2319
+
2320
+
2321
+
2322
+
2323
+
2324
+
2325
+
2326
+
2327
+
2328
+
2329
+
2330
+
2331
+
2332
+
2333
+
2334
+
2335
+
2336
+
2337
+
2338
+
2339
+
2340
+
2341
+
2342
+
2343
+
2344
+
2345
+
2346
+
2347
+
2348
+
2349
+
2350
+
2351
+
2352
+
2353
+
2354
+
2355
+
2356
+
2357
+
2358
+
2359
+
2360
+
2361
+
2362
+
2363
+
2364
+
2365
+
2366
+
2367
+
2368
+
2369
+
2370
+
2371
+
2372
+
2373
+
2374
+
2375
+
2376
+
2377
+
2378
+
2379
+
2380
+
2381
+
2382
+
2383
+
2384
+
2385
+
2386
+
2387
+
2388
+
2389
+
2390
+
2391
+
2392
+
2393
+
2394
+
2395
+
2396
+
2397
+
2398
+
2399
+
2400
+
2401
+
2402
+
2403
+
2404
+
2405
+
2406
+
2407
+
2408
+
2409
+
2410
+
2411
+
2412
+
2413
+
2414
+
2415
+
2416
+
2417
+
2418
+
2419
+
2420
+
2421
+
2422
+
2423
+
2424
+
2425
+
2426
+
2427
+
2428
+
2429
+
2430
+
2431
+
2432
+
2433
+
2434
+
2435
+
2436
+
2437
+
2438
+
2439
+
2440
+
2441
+
2442
+
2443
+
2444
+
2445
+
2446
+
2447
+
2448
+
2449
+
2450
+
2451
+
2452
+
2453
+
2454
+
2455
+
2456
+
2457
+
2458
+
2459
+
2460
+
2461
+ * @example
2462
+ * // Aggregate values
2463
+ * const tm = new TreeMap<number, number>([[1, 10], [2, 20]]);
2464
+ * console.log(tm.reduce((acc, v) => acc + (v ?? 0), 0)); // 30;
2465
+ */
2466
+ reduce<A>(callbackfn: TreeMapReduceCallback<K, V, A, TreeMap<K, V>>, initialValue: A): A {
2467
+ let acc = initialValue;
2468
+ let index = 0;
2469
+ for (const [k, v] of this) acc = callbackfn(acc, v, k, index++, this);
2470
+ return acc;
2471
+ }
2472
+
2473
+ /**
2474
+ * Test whether all entries satisfy a predicate.
2475
+ * @remarks Time O(n), Space O(1)
2476
+
2477
+
2478
+
2479
+
2480
+
2481
+
2482
+
2483
+
2484
+
2485
+
2486
+
2487
+
2488
+
2489
+
2490
+
2491
+
2492
+
2493
+
2494
+
2495
+
2496
+
2497
+
2498
+
2499
+
2500
+
2501
+
2502
+
2503
+
2504
+
2505
+
2506
+
2507
+
2508
+
2509
+
2510
+
2511
+
2512
+
2513
+
2514
+
2515
+
2516
+
2517
+
2518
+
2519
+
2520
+
2521
+
2522
+
2523
+
2524
+
2525
+
2526
+
2527
+
2528
+
2529
+
2530
+
2531
+
2532
+
2533
+
2534
+
2535
+
2536
+
2537
+
2538
+
2539
+
2540
+
2541
+
2542
+
2543
+
2544
+
2545
+
2546
+
2547
+
2548
+
2549
+
2550
+
2551
+
2552
+
2553
+
2554
+
2555
+
2556
+
2557
+
2558
+
2559
+
2560
+
2561
+
2562
+
2563
+
2564
+
2565
+
2566
+
2567
+
2568
+
2569
+
2570
+
2571
+
2572
+
2573
+
2574
+
2575
+
2576
+
2577
+
2578
+
2579
+
2580
+
2581
+
2582
+
2583
+
2584
+
2585
+
2586
+
2587
+
2588
+
2589
+
2590
+
2591
+
2592
+
2593
+
2594
+
2595
+
2596
+
2597
+
2598
+
2599
+
2600
+
2601
+
2602
+
2603
+
2604
+
2605
+
2606
+
2607
+
2608
+
2609
+
2610
+
2611
+
2612
+
2613
+
2614
+
2615
+
2616
+
2617
+
2618
+
2619
+
2620
+
2621
+
2622
+
2623
+
2624
+
2625
+
2626
+
2627
+
2628
+
2629
+
2630
+
2631
+
2632
+ * @example
2633
+ * // Test all entries
2634
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
2635
+ * console.log(tm.every((v, k) => k > 0)); // true;
2636
+ */
2637
+ every(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
2638
+ let index = 0;
2639
+ for (const [k, v] of this) {
2640
+ const ok = thisArg === undefined
2641
+ ? callbackfn(v, k, index++, this)
2642
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2643
+ if (!ok) return false;
2644
+ }
2645
+ return true;
2646
+ }
2647
+
2648
+ /**
2649
+ * Test whether any entry satisfies a predicate.
2650
+ * @remarks Time O(n), Space O(1)
2651
+
2652
+
2653
+
2654
+
2655
+
2656
+
2657
+
2658
+
2659
+
2660
+
2661
+
2662
+
2663
+
2664
+
2665
+
2666
+
2667
+
2668
+
2669
+
2670
+
2671
+
2672
+
2673
+
2674
+
2675
+
2676
+
2677
+
2678
+
2679
+
2680
+
2681
+
2682
+
2683
+
2684
+
2685
+
2686
+
2687
+
2688
+
2689
+
2690
+
2691
+
2692
+
2693
+
2694
+
2695
+
2696
+
2697
+
2698
+
2699
+
2700
+
2701
+
2702
+
2703
+
2704
+
2705
+
2706
+
2707
+
2708
+
2709
+
2710
+
2711
+
2712
+
2713
+
2714
+
2715
+
2716
+
2717
+
2718
+
2719
+
2720
+
2721
+
2722
+
2723
+
2724
+
2725
+
2726
+
2727
+
2728
+
2729
+
2730
+
2731
+
2732
+
2733
+
2734
+
2735
+
2736
+
2737
+
2738
+
2739
+
2740
+
2741
+
2742
+
2743
+
2744
+
2745
+
2746
+
2747
+
2748
+
2749
+
2750
+
2751
+
2752
+
2753
+
2754
+
2755
+
2756
+
2757
+
2758
+
2759
+
2760
+
2761
+
2762
+
2763
+
2764
+
2765
+
2766
+
2767
+
2768
+
2769
+
2770
+
2771
+
2772
+
2773
+
2774
+
2775
+
2776
+
2777
+
2778
+
2779
+
2780
+
2781
+
2782
+
2783
+
2784
+
2785
+
2786
+
2787
+
2788
+
2789
+
2790
+
2791
+
2792
+
2793
+
2794
+
2795
+
2796
+
2797
+
2798
+
2799
+
2800
+
2801
+
2802
+
2803
+
2804
+
2805
+
2806
+
2807
+ * @example
2808
+ * // Test any entry
2809
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
2810
+ * console.log(tm.some((v, k) => k === 2)); // true;
2811
+ */
2812
+ some(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): boolean {
2813
+ let index = 0;
2814
+ for (const [k, v] of this) {
2815
+ const ok = thisArg === undefined
2816
+ ? callbackfn(v, k, index++, this)
2817
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2818
+ if (ok) return true;
2819
+ }
2820
+ return false;
2821
+ }
2822
+
2823
+ /**
2824
+ * Find the first entry that satisfies a predicate.
2825
+ * @returns The first matching `[key, value]` tuple, or `undefined`.
2826
+ * @remarks Time O(n), Space O(1)
2827
+
2828
+
2829
+
2830
+
2831
+
2832
+
2833
+
2834
+
2835
+
2836
+
2837
+
2838
+
2839
+
2840
+
2841
+
2842
+
2843
+
2844
+
2845
+
2846
+
2847
+
2848
+
2849
+
2850
+
2851
+
2852
+
2853
+
2854
+
2855
+
2856
+
2857
+
2858
+
2859
+
2860
+
2861
+
2862
+
2863
+
2864
+
2865
+
2866
+
2867
+
2868
+
2869
+
2870
+
2871
+
2872
+
2873
+
2874
+
2875
+
2876
+
2877
+
2878
+
2879
+
2880
+
2881
+
2882
+
2883
+
2884
+
2885
+
2886
+
2887
+
2888
+
2889
+
2890
+
2891
+
2892
+
2893
+
2894
+
2895
+
2896
+
2897
+
2898
+
2899
+
2900
+
2901
+
2902
+
2903
+
2904
+
2905
+
2906
+
2907
+
2908
+
2909
+
2910
+
2911
+
2912
+
2913
+
2914
+
2915
+
2916
+
2917
+
2918
+
2919
+
2920
+
2921
+
2922
+
2923
+
2924
+
2925
+
2926
+
2927
+
2928
+
2929
+
2930
+
2931
+
2932
+
2933
+
2934
+
2935
+
2936
+
2937
+
2938
+
2939
+
2940
+
2941
+
2942
+
2943
+
2944
+
2945
+
2946
+
2947
+
2948
+
2949
+
2950
+
2951
+
2952
+
2953
+
2954
+
2955
+
2956
+
2957
+
2958
+
2959
+
2960
+
2961
+
2962
+
2963
+
2964
+
2965
+
2966
+
2967
+
2968
+
2969
+
2970
+
2971
+
2972
+
2973
+
2974
+
2975
+
2976
+
2977
+
2978
+
2979
+
2980
+
2981
+
2982
+
2983
+ * @example
2984
+ * // Find matching entry
2985
+ * const tm = new TreeMap<number, string>([[1, 'a'], [2, 'b']]);
2986
+ * console.log(tm.find(v => v === 'b')?.[0]); // 2;
2987
+ */
2988
+ find(callbackfn: TreeMapEntryCallback<K, V, boolean, TreeMap<K, V>>, thisArg?: unknown): [K, V | undefined] | undefined {
2989
+ let index = 0;
2990
+ for (const [k, v] of this) {
2991
+ const ok = thisArg === undefined
2992
+ ? callbackfn(v, k, index++, this)
2993
+ : (callbackfn as (this: unknown, v: V | undefined, k: K, i: number, self: TreeMap<K, V>) => boolean).call(thisArg, v, k, index++, this);
2994
+ if (ok) return [k, v];
2995
+ }
2996
+ return undefined;
2997
+ }
2998
+
2999
+ /**
3000
+ * Materialize the map into an array of `[key, value]` tuples.
3001
+ * @remarks Time O(n), Space O(n)
3002
+
3003
+
3004
+
3005
+
3006
+
3007
+
3008
+
3009
+
3010
+
3011
+
3012
+
3013
+
3014
+
3015
+
3016
+
3017
+
3018
+
3019
+
3020
+
3021
+
3022
+
3023
+
3024
+
3025
+
3026
+
3027
+
3028
+
3029
+
3030
+
3031
+
3032
+
3033
+
3034
+
3035
+
3036
+
3037
+
3038
+
3039
+
3040
+
3041
+
3042
+
3043
+
3044
+
3045
+
3046
+
3047
+
3048
+
3049
+
3050
+
3051
+
3052
+
3053
+
3054
+
3055
+
3056
+
3057
+
3058
+
3059
+
3060
+
3061
+
3062
+
3063
+
3064
+
3065
+
3066
+
3067
+
3068
+
3069
+
3070
+
3071
+
3072
+
3073
+
3074
+
3075
+
3076
+
3077
+
3078
+
3079
+
3080
+
3081
+
3082
+
3083
+
3084
+
3085
+
3086
+
3087
+
3088
+
3089
+
3090
+
3091
+
3092
+
3093
+
3094
+
3095
+
3096
+
3097
+
3098
+
3099
+
3100
+
3101
+
3102
+
3103
+
3104
+
3105
+
3106
+
3107
+
3108
+
3109
+
3110
+
3111
+
3112
+
3113
+
3114
+
3115
+
3116
+
3117
+
3118
+
3119
+
3120
+
3121
+
3122
+
3123
+
3124
+
3125
+
3126
+
3127
+
3128
+
3129
+
3130
+
3131
+
3132
+
3133
+
3134
+
3135
+
3136
+
3137
+
3138
+
3139
+
3140
+
3141
+
3142
+
3143
+
3144
+
3145
+
3146
+
3147
+
3148
+
3149
+
3150
+
3151
+
3152
+
3153
+
3154
+
3155
+
3156
+
3157
+
3158
+
3159
+
3160
+ * @example
3161
+ * // Convert to array
3162
+ * const tm = new TreeMap<number, string>([[2, 'b'], [1, 'a']]);
3163
+ * console.log(tm.toArray()); // [[1, 'a'], [2, 'b']];
3164
+ */
3165
+ toArray(): Array<[K, V | undefined]> {
3166
+ return [...this];
3167
+ }
3168
+
3169
+ /**
3170
+ * Print a human-friendly representation.
3171
+ * @remarks Time O(n), Space O(n)
3172
+
3173
+
3174
+
3175
+
3176
+
3177
+
3178
+
3179
+
3180
+
3181
+
3182
+
3183
+
3184
+
3185
+
3186
+
3187
+
3188
+
3189
+
3190
+
3191
+
3192
+
3193
+
3194
+
3195
+
3196
+
3197
+
3198
+
3199
+
3200
+
3201
+
3202
+
3203
+
3204
+
3205
+
3206
+
3207
+
3208
+
3209
+
3210
+
3211
+
3212
+
3213
+
3214
+
3215
+
3216
+
3217
+
3218
+
3219
+
3220
+
3221
+
3222
+
3223
+
3224
+
3225
+
3226
+
3227
+
3228
+
3229
+
3230
+
3231
+
3232
+
3233
+
3234
+
3235
+
3236
+
3237
+
3238
+
3239
+
3240
+
3241
+
3242
+
3243
+
3244
+
3245
+
3246
+
3247
+
3248
+
3249
+
3250
+
3251
+
3252
+
3253
+
3254
+
3255
+
3256
+
3257
+
3258
+
3259
+
3260
+
3261
+
3262
+
3263
+
3264
+
3265
+
3266
+
3267
+
3268
+
3269
+
3270
+
3271
+
3272
+
3273
+
3274
+
3275
+
3276
+
3277
+
3278
+
3279
+
3280
+
3281
+
3282
+
3283
+
3284
+
3285
+
3286
+
3287
+
3288
+
3289
+
3290
+
3291
+
3292
+
3293
+
3294
+
3295
+
3296
+
3297
+
3298
+
3299
+
3300
+
3301
+
3302
+
3303
+
3304
+
3305
+
3306
+
3307
+
3308
+
3309
+
3310
+
3311
+
3312
+
3313
+
3314
+
3315
+
3316
+
3317
+
3318
+
3319
+
3320
+
3321
+
3322
+
3323
+
3324
+
3325
+
3326
+
3327
+
3328
+
3329
+
3330
+ * @example
3331
+ * // Display tree
3332
+ * const tm = new TreeMap<number, string>([[1, 'a']]);
3333
+ * expect(() => tm.print()).not.toThrow();
3334
+ */
3335
+ print(): void {
3336
+ // Delegate to the underlying tree's visualization.
3337
+ this.#core.print();
3338
+ }
3339
+
3340
+ // Navigable operations (return entry tuples)
3341
+ // Note: returned tuple values may be `undefined`.
3342
+
3343
+ /**
3344
+ * Smallest entry by key.
3345
+
3346
+
3347
+
3348
+
3349
+
3350
+
3351
+
3352
+
3353
+
3354
+
3355
+
3356
+
3357
+
3358
+
3359
+
3360
+
3361
+
3362
+
3363
+
3364
+
3365
+
3366
+
3367
+
3368
+
3369
+
3370
+
3371
+
3372
+
3373
+
3374
+
3375
+
3376
+
3377
+
3378
+
3379
+
3380
+ * @example
3381
+ * // Leaderboard with ranked scores
3382
+ * // Use score as key (descending), player name as value
3383
+ * const leaderboard = new TreeMap<number, string>([], {
3384
+ * comparator: (a, b) => b - a // descending
3385
+ * });
3386
+ *
3387
+ * leaderboard.set(1500, 'Alice');
3388
+ * leaderboard.set(2200, 'Bob');
3389
+ * leaderboard.set(1800, 'Charlie');
3390
+ * leaderboard.set(2500, 'Diana');
3391
+ *
3392
+ * // Top 3 players (first 3 in descending order)
3393
+ * const top3 = [...leaderboard.entries()].slice(0, 3);
3394
+ * console.log(top3); // [
3395
+ * // [2500, 'Diana'],
3396
+ * // [2200, 'Bob'],
3397
+ * // [1800, 'Charlie']
3398
+ * // ];
3399
+ *
3400
+ * // Highest scorer
3401
+ * console.log(leaderboard.first()); // [2500, 'Diana'];
3402
+ *
3403
+ * // Remove lowest scorer
3404
+ * console.log(leaderboard.pollLast()); // [1500, 'Alice'];
3405
+ * console.log(leaderboard.size); // 3;
3406
+ */
3407
+ first(): [K, V | undefined] | undefined {
3408
+ const k = this.#core.getLeftMost();
3409
+ return k === undefined ? undefined : this._entryFromKey(k);
3410
+ }
3411
+
3412
+ /**
3413
+ * Largest entry by key.
3414
+
3415
+
3416
+
3417
+
3418
+
3419
+
3420
+
3421
+
3422
+
3423
+
3424
+
3425
+
3426
+
3427
+
3428
+
3429
+
3430
+
3431
+
3432
+
3433
+
3434
+
3435
+
3436
+
3437
+
3438
+
3439
+
3440
+
3441
+
3442
+
3443
+
3444
+
3445
+
3446
+
3447
+
3448
+
3449
+ * @example
3450
+ * // Access the maximum entry
3451
+ * const scores = new TreeMap<number, string>([
3452
+ * [85, 'Bob'],
3453
+ * [92, 'Alice'],
3454
+ * [78, 'Charlie']
3455
+ * ]);
3456
+ *
3457
+ * console.log(scores.last()); // [92, 'Alice'];
3458
+ * console.log(scores.first()); // [78, 'Charlie'];
3459
+ */
3460
+ last(): [K, V | undefined] | undefined {
3461
+ const k = this.#core.getRightMost();
3462
+ return k === undefined ? undefined : this._entryFromKey(k);
3463
+ }
3464
+
3465
+ /**
3466
+ * Remove and return the smallest entry.
3467
+
3468
+
3469
+
3470
+
3471
+
3472
+
3473
+
3474
+
3475
+
3476
+
3477
+
3478
+
3479
+
3480
+
3481
+
3482
+
3483
+
3484
+
3485
+
3486
+
3487
+
3488
+
3489
+
3490
+
3491
+
3492
+
3493
+
3494
+
3495
+
3496
+
3497
+
3498
+
3499
+
3500
+
3501
+
3502
+ * @example
3503
+ * // Process items from lowest priority
3504
+ * const tasks = new TreeMap<number, string>([
3505
+ * [3, 'Low'],
3506
+ * [1, 'Critical'],
3507
+ * [2, 'Medium']
3508
+ * ]);
3509
+ *
3510
+ * // Process lowest priority first
3511
+ * console.log(tasks.pollFirst()); // [1, 'Critical'];
3512
+ * console.log(tasks.pollFirst()); // [2, 'Medium'];
3513
+ * console.log(tasks.size); // 1;
3514
+ */
3515
+ pollFirst(): [K, V | undefined] | undefined {
3516
+ const entry = this.first();
3517
+ if (!entry) return undefined;
3518
+ this.delete(entry[0]);
3519
+ return entry;
3520
+ }
3521
+
3522
+ /**
3523
+ * Remove and return the largest entry.
3524
+
3525
+
3526
+
3527
+
3528
+
3529
+
3530
+
3531
+
3532
+
3533
+
3534
+
3535
+
3536
+
3537
+
3538
+
3539
+
3540
+
3541
+
3542
+
3543
+
3544
+
3545
+
3546
+
3547
+
3548
+
3549
+
3550
+
3551
+
3552
+
3553
+
3554
+
3555
+
3556
+
3557
+
3558
+
3559
+ * @example
3560
+ * // Remove the maximum entry
3561
+ * const bids = new TreeMap<number, string>([
3562
+ * [100, 'Alice'],
3563
+ * [150, 'Bob'],
3564
+ * [120, 'Charlie']
3565
+ * ]);
3566
+ *
3567
+ * // Remove highest bid
3568
+ * console.log(bids.pollLast()); // [150, 'Bob'];
3569
+ * console.log(bids.size); // 2;
3570
+ * console.log(bids.last()); // [120, 'Charlie'];
3571
+ */
3572
+ pollLast(): [K, V | undefined] | undefined {
3573
+ const entry = this.last();
3574
+ if (!entry) return undefined;
3575
+ this.delete(entry[0]);
3576
+ return entry;
3577
+ }
3578
+
3579
+ /**
3580
+ * Smallest entry whose key is >= the given key.
3581
+
3582
+
3583
+
3584
+
3585
+
3586
+
3587
+
3588
+
3589
+
3590
+
3591
+
3592
+
3593
+
3594
+
3595
+
3596
+
3597
+
3598
+
3599
+
3600
+
3601
+
3602
+
3603
+
3604
+
3605
+
3606
+
3607
+
3608
+
3609
+
3610
+
3611
+
3612
+
3613
+
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+
3624
+
3625
+
3626
+
3627
+
3628
+
3629
+
3630
+
3631
+
3632
+
3633
+
3634
+
3635
+
3636
+
3637
+
3638
+
3639
+
3640
+
3641
+
3642
+
3643
+
3644
+
3645
+
3646
+
3647
+
3648
+
3649
+
3650
+
3651
+
3652
+
3653
+
3654
+
3655
+
3656
+
3657
+
3658
+
3659
+
3660
+
3661
+
3662
+
3663
+
3664
+
3665
+
3666
+
3667
+
3668
+
3669
+
3670
+
3671
+
3672
+
3673
+
3674
+
3675
+
3676
+
3677
+
3678
+
3679
+
3680
+
3681
+
3682
+
3683
+
3684
+
3685
+
3686
+
3687
+
3688
+
3689
+
3690
+
3691
+
3692
+
3693
+
3694
+
3695
+
3696
+
3697
+
3698
+
3699
+
3700
+
3701
+
3702
+
3703
+
3704
+
3705
+
3706
+
3707
+
3708
+
3709
+
3710
+
3711
+
3712
+
3713
+
3714
+
3715
+ * @example
3716
+ * // Event scheduler with time-based lookup
3717
+ * const events = new TreeMap<Date, string>();
3718
+ *
3719
+ * const meeting = new Date('2024-01-15T10:00:00Z');
3720
+ * const lunch = new Date('2024-01-15T12:00:00Z');
3721
+ * const review = new Date('2024-01-15T15:00:00Z');
3722
+ * const standup = new Date('2024-01-15T09:00:00Z');
3723
+ *
3724
+ * events.set(meeting, 'Team Meeting');
3725
+ * events.set(lunch, 'Lunch Break');
3726
+ * events.set(review, 'Code Review');
1473
3727
  * events.set(standup, 'Daily Standup');
1474
3728
  *
1475
3729
  * // Events are sorted chronologically
@@ -1480,24 +3734,432 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1480
3734
  * // 'Code Review'
1481
3735
  * // ];
1482
3736
  *
1483
- * // Next event after 11:00
1484
- * const after11 = new Date('2024-01-15T11:00:00Z');
1485
- * console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
3737
+ * // Next event after 11:00
3738
+ * const after11 = new Date('2024-01-15T11:00:00Z');
3739
+ * console.log(events.ceiling(after11)?.[1]); // 'Lunch Break';
3740
+ *
3741
+ * // Events between 9:30 and 13:00
3742
+ * const from = new Date('2024-01-15T09:30:00Z');
3743
+ * const to = new Date('2024-01-15T13:00:00Z');
3744
+ * const window = events.rangeSearch([from, to]);
3745
+ * console.log(window.map(([, v]) => v)); // ['Team Meeting', 'Lunch Break'];
3746
+ */
3747
+ ceiling(key: K): [K, V | undefined] | undefined {
3748
+ this._validateKey(key);
3749
+ const k = this.#core.ceiling(key);
3750
+ return k === undefined ? undefined : this._entryFromKey(k);
3751
+ }
3752
+
3753
+ /**
3754
+ * Largest entry whose key is <= the given key.
3755
+
3756
+
3757
+
3758
+
3759
+
3760
+
3761
+
3762
+
3763
+
3764
+
3765
+
3766
+
3767
+
3768
+
3769
+
3770
+
3771
+
3772
+
3773
+
3774
+
3775
+
3776
+
3777
+
3778
+
3779
+
3780
+
3781
+
3782
+
3783
+
3784
+
3785
+
3786
+
3787
+
3788
+
3789
+
3790
+
3791
+
3792
+
3793
+
3794
+
3795
+
3796
+
3797
+
3798
+
3799
+
3800
+
3801
+
3802
+
3803
+
3804
+
3805
+
3806
+
3807
+
3808
+
3809
+
3810
+
3811
+
3812
+
3813
+
3814
+
3815
+
3816
+
3817
+
3818
+
3819
+
3820
+
3821
+
3822
+
3823
+
3824
+
3825
+
3826
+
3827
+
3828
+
3829
+
3830
+
3831
+
3832
+
3833
+
3834
+
3835
+
3836
+
3837
+
3838
+
3839
+
3840
+
3841
+
3842
+
3843
+
3844
+
3845
+
3846
+
3847
+
3848
+
3849
+
3850
+
3851
+
3852
+
3853
+
3854
+
3855
+
3856
+
3857
+
3858
+
3859
+
3860
+
3861
+
3862
+
3863
+
3864
+
3865
+
3866
+
3867
+
3868
+
3869
+
3870
+
3871
+
3872
+
3873
+
3874
+
3875
+
3876
+
3877
+
3878
+
3879
+
3880
+
3881
+
3882
+
3883
+
3884
+
3885
+
3886
+
3887
+
3888
+
3889
+ * @example
3890
+ * // Find the largest key ≤ target
3891
+ * const versions = new TreeMap<number, string>([
3892
+ * [1, 'v1.0'],
3893
+ * [3, 'v3.0'],
3894
+ * [5, 'v5.0'],
3895
+ * [7, 'v7.0']
3896
+ * ]);
3897
+ *
3898
+ * // Largest version ≤ 4
3899
+ * console.log(versions.floor(4)); // [3, 'v3.0'];
3900
+ * // Largest version ≤ 5 (exact match)
3901
+ * console.log(versions.floor(5)); // [5, 'v5.0'];
3902
+ * // No version ≤ 0
3903
+ * console.log(versions.floor(0)); // undefined;
3904
+ */
3905
+ floor(key: K): [K, V | undefined] | undefined {
3906
+ this._validateKey(key);
3907
+ const k = this.#core.floor(key);
3908
+ return k === undefined ? undefined : this._entryFromKey(k);
3909
+ }
3910
+
3911
+ /**
3912
+ * Smallest entry whose key is > the given key.
3913
+
3914
+
3915
+
3916
+
3917
+
3918
+
3919
+
3920
+
3921
+
3922
+
3923
+
3924
+
3925
+
3926
+
3927
+
3928
+
3929
+
3930
+
3931
+
3932
+
3933
+
3934
+
3935
+
3936
+
3937
+
3938
+
3939
+
3940
+
3941
+
3942
+
3943
+
3944
+
3945
+
3946
+
3947
+
3948
+
3949
+
3950
+
3951
+
3952
+
3953
+
3954
+
3955
+
3956
+
3957
+
3958
+
3959
+
3960
+
3961
+
3962
+
3963
+
3964
+
3965
+
3966
+
3967
+
3968
+
3969
+
3970
+
3971
+
3972
+
3973
+
3974
+
3975
+
3976
+
3977
+
3978
+
3979
+
3980
+
3981
+
3982
+
3983
+
3984
+
3985
+
3986
+
3987
+
3988
+
3989
+
3990
+
3991
+
3992
+
3993
+
3994
+
3995
+
3996
+
3997
+
3998
+
3999
+
4000
+
4001
+
4002
+
4003
+
4004
+
4005
+
4006
+
4007
+
4008
+
4009
+
4010
+
4011
+
4012
+
4013
+
4014
+
4015
+
4016
+
4017
+
4018
+
4019
+
4020
+
4021
+
4022
+
4023
+
4024
+
4025
+
4026
+
4027
+
4028
+
4029
+
4030
+
4031
+
4032
+
4033
+
4034
+
4035
+
4036
+
4037
+
4038
+
4039
+
4040
+
4041
+
4042
+
4043
+
4044
+
4045
+
4046
+
4047
+ * @example
4048
+ * // Find the smallest key strictly > target
4049
+ * const prices = new TreeMap<number, string>([
4050
+ * [10, 'Basic'],
4051
+ * [25, 'Standard'],
4052
+ * [50, 'Premium'],
4053
+ * [100, 'Enterprise']
4054
+ * ]);
1486
4055
  *
1487
- * // Events between 9:30 and 13:00
1488
- * const from = new Date('2024-01-15T09:30:00Z');
1489
- * const to = new Date('2024-01-15T13:00:00Z');
1490
- * const window = events.rangeSearch([from, to]);
1491
- * console.log(window.map(([, v]) => v)); // ['Team Meeting', 'Lunch Break'];
4056
+ * // Next tier above $25
4057
+ * console.log(prices.higher(25)); // [50, 'Premium'];
4058
+ * // Next tier above $99
4059
+ * console.log(prices.higher(99)); // [100, 'Enterprise'];
4060
+ * // Nothing above $100
4061
+ * console.log(prices.higher(100)); // undefined;
1492
4062
  */
1493
- ceiling(key: K): [K, V | undefined] | undefined {
4063
+ higher(key: K): [K, V | undefined] | undefined {
1494
4064
  this._validateKey(key);
1495
- const k = this.#core.ceiling(key);
4065
+ const k = this.#core.higher(key);
1496
4066
  return k === undefined ? undefined : this._entryFromKey(k);
1497
4067
  }
1498
4068
 
1499
4069
  /**
1500
- * Largest entry whose key is <= the given key.
4070
+ * Largest entry whose key is < the given key.
4071
+
4072
+
4073
+
4074
+
4075
+
4076
+
4077
+
4078
+
4079
+
4080
+
4081
+
4082
+
4083
+
4084
+
4085
+
4086
+
4087
+
4088
+
4089
+
4090
+
4091
+
4092
+
4093
+
4094
+
4095
+
4096
+
4097
+
4098
+
4099
+
4100
+
4101
+
4102
+
4103
+
4104
+
4105
+
4106
+
4107
+
4108
+
4109
+
4110
+
4111
+
4112
+
4113
+
4114
+
4115
+
4116
+
4117
+
4118
+
4119
+
4120
+
4121
+
4122
+
4123
+
4124
+
4125
+
4126
+
4127
+
4128
+
4129
+
4130
+
4131
+
4132
+
4133
+
4134
+
4135
+
4136
+
4137
+
4138
+
4139
+
4140
+
4141
+
4142
+
4143
+
4144
+
4145
+
4146
+
4147
+
4148
+
4149
+
4150
+
4151
+
4152
+
4153
+
4154
+
4155
+
4156
+
4157
+
4158
+
4159
+
4160
+
4161
+
4162
+
1501
4163
 
1502
4164
 
1503
4165
 
@@ -1541,29 +4203,38 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1541
4203
 
1542
4204
 
1543
4205
  * @example
1544
- * // Find the largest key target
1545
- * const versions = new TreeMap<number, string>([
1546
- * [1, 'v1.0'],
1547
- * [3, 'v3.0'],
1548
- * [5, 'v5.0'],
1549
- * [7, 'v7.0']
4206
+ * // Find the largest key strictly < target
4207
+ * const temps = new TreeMap<number, string>([
4208
+ * [0, 'Freezing'],
4209
+ * [20, 'Cool'],
4210
+ * [30, 'Warm'],
4211
+ * [40, 'Hot']
1550
4212
  * ]);
1551
4213
  *
1552
- * // Largest version 4
1553
- * console.log(versions.floor(4)); // [3, 'v3.0'];
1554
- * // Largest version ≤ 5 (exact match)
1555
- * console.log(versions.floor(5)); // [5, 'v5.0'];
1556
- * // No version ≤ 0
1557
- * console.log(versions.floor(0)); // undefined;
4214
+ * // Largest reading below 30
4215
+ * console.log(temps.lower(30)); // [20, 'Cool'];
4216
+ * // Nothing below 0
4217
+ * console.log(temps.lower(0)); // undefined;
1558
4218
  */
1559
- floor(key: K): [K, V | undefined] | undefined {
4219
+ lower(key: K): [K, V | undefined] | undefined {
1560
4220
  this._validateKey(key);
1561
- const k = this.#core.floor(key);
4221
+ const k = this.#core.lower(key);
1562
4222
  return k === undefined ? undefined : this._entryFromKey(k);
1563
4223
  }
1564
4224
 
1565
4225
  /**
1566
- * Smallest entry whose key is > the given key.
4226
+ * Return all entries in a given key range.
4227
+ *
4228
+ * @param range `[low, high]`
4229
+ * @param options Inclusive/exclusive bounds (defaults to inclusive).
4230
+
4231
+
4232
+
4233
+
4234
+
4235
+
4236
+
4237
+
1567
4238
 
1568
4239
 
1569
4240
 
@@ -1606,30 +4277,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1606
4277
 
1607
4278
 
1608
4279
 
1609
- * @example
1610
- * // Find the smallest key strictly > target
1611
- * const prices = new TreeMap<number, string>([
1612
- * [10, 'Basic'],
1613
- * [25, 'Standard'],
1614
- * [50, 'Premium'],
1615
- * [100, 'Enterprise']
1616
- * ]);
1617
- *
1618
- * // Next tier above $25
1619
- * console.log(prices.higher(25)); // [50, 'Premium'];
1620
- * // Next tier above $99
1621
- * console.log(prices.higher(99)); // [100, 'Enterprise'];
1622
- * // Nothing above $100
1623
- * console.log(prices.higher(100)); // undefined;
1624
- */
1625
- higher(key: K): [K, V | undefined] | undefined {
1626
- this._validateKey(key);
1627
- const k = this.#core.higher(key);
1628
- return k === undefined ? undefined : this._entryFromKey(k);
1629
- }
1630
-
1631
- /**
1632
- * Largest entry whose key is < the given key.
1633
4280
 
1634
4281
 
1635
4282
 
@@ -1672,31 +4319,6 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1672
4319
 
1673
4320
 
1674
4321
 
1675
- * @example
1676
- * // Find the largest key strictly < target
1677
- * const temps = new TreeMap<number, string>([
1678
- * [0, 'Freezing'],
1679
- * [20, 'Cool'],
1680
- * [30, 'Warm'],
1681
- * [40, 'Hot']
1682
- * ]);
1683
- *
1684
- * // Largest reading below 30
1685
- * console.log(temps.lower(30)); // [20, 'Cool'];
1686
- * // Nothing below 0
1687
- * console.log(temps.lower(0)); // undefined;
1688
- */
1689
- lower(key: K): [K, V | undefined] | undefined {
1690
- this._validateKey(key);
1691
- const k = this.#core.lower(key);
1692
- return k === undefined ? undefined : this._entryFromKey(k);
1693
- }
1694
-
1695
- /**
1696
- * Return all entries in a given key range.
1697
- *
1698
- * @param range `[low, high]`
1699
- * @param options Inclusive/exclusive bounds (defaults to inclusive).
1700
4322
 
1701
4323
 
1702
4324
 
@@ -1790,6 +4412,74 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1790
4412
  return out;
1791
4413
  }
1792
4414
 
4415
+ // ─── Order-Statistic Methods ───────────────────────────
4416
+
4417
+ /**
4418
+ * Returns the entry at the k-th position in tree order (0-indexed).
4419
+ * @remarks Time O(log n). Requires `enableOrderStatistic: true`.
4420
+
4421
+
4422
+
4423
+ * @example
4424
+ * // Find k-th entry in a TreeMap
4425
+ * const map = new TreeMap<string, number>(
4426
+ * [['alice', 95], ['bob', 87], ['charlie', 92]],
4427
+ * { enableOrderStatistic: true }
4428
+ * );
4429
+ * console.log(map.getByRank(0)); // 'alice';
4430
+ * console.log(map.getByRank(1)); // 'bob';
4431
+ * console.log(map.getByRank(2)); // 'charlie';
4432
+ */
4433
+ getByRank(k: number): [K, V | undefined] | undefined {
4434
+ const key = this.#core.getByRank(k);
4435
+ if (key === undefined) return undefined;
4436
+ return [key, this.#core.get(key)];
4437
+ }
4438
+
4439
+ /**
4440
+ * Returns the 0-based rank of a key (number of elements that precede it in tree order).
4441
+ * @remarks Time O(log n). Requires `enableOrderStatistic: true`.
4442
+ * @example
4443
+ * // Get the rank of a key in sorted order
4444
+ * const tree = new TreeMap<number>(
4445
+ * [10, 20, 30, 40, 50],
4446
+ * { enableOrderStatistic: true }
4447
+ * );
4448
+ * console.log(tree.getRank(10)); // 0; // smallest → rank 0
4449
+ * console.log(tree.getRank(30)); // 2; // 2 elements before 30 in tree order
4450
+ * console.log(tree.getRank(50)); // 4; // largest → rank 4
4451
+ * console.log(tree.getRank(25)); // 2;
4452
+ */
4453
+ getRank(key: K): number {
4454
+ return this.#core.getRank(key);
4455
+ }
4456
+
4457
+ /**
4458
+ * Returns keys by rank range (0-indexed, inclusive on both ends).
4459
+ * @remarks Time O(log n + k). Requires `enableOrderStatistic: true`.
4460
+
4461
+ * @example
4462
+ * // Pagination with rangeByRank
4463
+ * const tree = new TreeMap<number>(
4464
+ * [10, 20, 30, 40, 50, 60, 70, 80, 90],
4465
+ * { enableOrderStatistic: true }
4466
+ * );
4467
+ * const pageSize = 3;
4468
+ *
4469
+ * // Page 1
4470
+ * console.log(tree.rangeByRank(0, pageSize - 1)); // [10, 20, 30];
4471
+ * // Page 2
4472
+ * console.log(tree.rangeByRank(pageSize, 2 * pageSize - 1)); // [40, 50, 60];
4473
+ * // Page 3
4474
+ * console.log(tree.rangeByRank(2 * pageSize, 3 * pageSize - 1)); // [70, 80, 90];
4475
+ */
4476
+ rangeByRank(start: number, end: number): Array<[K, V | undefined]> {
4477
+ const keys = this.#core.rangeByRank(start, end);
4478
+ return keys
4479
+ .filter((k): k is K => k !== undefined)
4480
+ .map(k => [k, this.#core.get(k)] as [K, V | undefined]);
4481
+ }
4482
+
1793
4483
  /**
1794
4484
  * Creates a shallow clone of this map.
1795
4485
  * @remarks Time O(n log n), Space O(n)
@@ -1816,6 +4506,121 @@ export class TreeMap<K = any, V = any, R = [K, V]> implements Iterable<[K, V | u
1816
4506
 
1817
4507
 
1818
4508
 
4509
+
4510
+
4511
+
4512
+
4513
+
4514
+
4515
+
4516
+
4517
+
4518
+
4519
+
4520
+
4521
+
4522
+
4523
+
4524
+
4525
+
4526
+
4527
+
4528
+
4529
+
4530
+
4531
+
4532
+
4533
+
4534
+
4535
+
4536
+
4537
+
4538
+
4539
+
4540
+
4541
+
4542
+
4543
+
4544
+
4545
+
4546
+
4547
+
4548
+
4549
+
4550
+
4551
+
4552
+
4553
+
4554
+
4555
+
4556
+
4557
+
4558
+
4559
+
4560
+
4561
+
4562
+
4563
+
4564
+
4565
+
4566
+
4567
+
4568
+
4569
+
4570
+
4571
+
4572
+
4573
+
4574
+
4575
+
4576
+
4577
+
4578
+
4579
+
4580
+
4581
+
4582
+
4583
+
4584
+
4585
+
4586
+
4587
+
4588
+
4589
+
4590
+
4591
+
4592
+
4593
+
4594
+
4595
+
4596
+
4597
+
4598
+
4599
+
4600
+
4601
+
4602
+
4603
+
4604
+
4605
+
4606
+
4607
+
4608
+
4609
+
4610
+
4611
+
4612
+
4613
+
4614
+
4615
+
4616
+
4617
+
4618
+
4619
+
4620
+
4621
+
4622
+
4623
+
1819
4624
 
1820
4625
 
1821
4626