data-structure-typed 2.4.5 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/.vitepress/cache/deps_temp_51f5f1b0/chunk-7OIKW5WK.js +12984 -0
  2. package/.vitepress/cache/deps_temp_51f5f1b0/package.json +3 -0
  3. package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vue_devtools-api.js +4505 -0
  4. package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vueuse_core.js +9731 -0
  5. package/.vitepress/cache/deps_temp_51f5f1b0/vue.js +347 -0
  6. package/CHANGELOG.md +3 -1
  7. package/README.md +78 -31
  8. package/dist/cjs/binary-tree.cjs +23698 -0
  9. package/dist/cjs/graph.cjs +5236 -0
  10. package/dist/cjs/hash.cjs +1262 -0
  11. package/dist/cjs/heap.cjs +1540 -0
  12. package/dist/cjs/index.cjs +24509 -2899
  13. package/dist/cjs/linked-list.cjs +4370 -0
  14. package/dist/cjs/matrix.cjs +1042 -0
  15. package/dist/cjs/priority-queue.cjs +1314 -0
  16. package/dist/cjs/queue.cjs +4090 -0
  17. package/dist/cjs/stack.cjs +861 -0
  18. package/dist/cjs/trie.cjs +1173 -0
  19. package/dist/cjs-legacy/binary-tree.cjs +23730 -0
  20. package/dist/cjs-legacy/graph.cjs +5234 -0
  21. package/dist/cjs-legacy/hash.cjs +1262 -0
  22. package/dist/cjs-legacy/heap.cjs +1537 -0
  23. package/dist/cjs-legacy/index.cjs +32555 -10936
  24. package/dist/cjs-legacy/linked-list.cjs +4376 -0
  25. package/dist/cjs-legacy/matrix.cjs +1045 -0
  26. package/dist/cjs-legacy/priority-queue.cjs +1312 -0
  27. package/dist/cjs-legacy/queue.cjs +4088 -0
  28. package/dist/cjs-legacy/stack.cjs +861 -0
  29. package/dist/cjs-legacy/trie.cjs +1172 -0
  30. package/dist/esm/binary-tree.mjs +23683 -0
  31. package/dist/esm/graph.mjs +5223 -0
  32. package/dist/esm/hash.mjs +1259 -0
  33. package/dist/esm/heap.mjs +1534 -0
  34. package/dist/esm/index.mjs +24507 -2898
  35. package/dist/esm/linked-list.mjs +4363 -0
  36. package/dist/esm/matrix.mjs +1038 -0
  37. package/dist/esm/priority-queue.mjs +1310 -0
  38. package/dist/esm/queue.mjs +4086 -0
  39. package/dist/esm/stack.mjs +859 -0
  40. package/dist/esm/trie.mjs +1170 -0
  41. package/dist/esm-legacy/binary-tree.mjs +23715 -0
  42. package/dist/esm-legacy/graph.mjs +5221 -0
  43. package/dist/esm-legacy/hash.mjs +1259 -0
  44. package/dist/esm-legacy/heap.mjs +1531 -0
  45. package/dist/esm-legacy/index.mjs +32553 -10935
  46. package/dist/esm-legacy/linked-list.mjs +4369 -0
  47. package/dist/esm-legacy/matrix.mjs +1041 -0
  48. package/dist/esm-legacy/priority-queue.mjs +1308 -0
  49. package/dist/esm-legacy/queue.mjs +4084 -0
  50. package/dist/esm-legacy/stack.mjs +859 -0
  51. package/dist/esm-legacy/trie.mjs +1169 -0
  52. package/dist/types/data-structures/base/index.d.ts +1 -0
  53. package/dist/types/data-structures/base/iterable-element-base.d.ts +1 -1
  54. package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
  55. package/dist/types/data-structures/base/linear-base.d.ts +3 -3
  56. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +368 -51
  57. package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +473 -147
  58. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +931 -80
  59. package/dist/types/data-structures/binary-tree/bst.d.ts +792 -29
  60. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +592 -32
  61. package/dist/types/data-structures/binary-tree/segment-tree.d.ts +320 -135
  62. package/dist/types/data-structures/binary-tree/tree-map.d.ts +3662 -6
  63. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3487 -201
  64. package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2778 -65
  65. package/dist/types/data-structures/binary-tree/tree-set.d.ts +3414 -6
  66. package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
  67. package/dist/types/data-structures/graph/directed-graph.d.ts +419 -47
  68. package/dist/types/data-structures/graph/map-graph.d.ts +59 -1
  69. package/dist/types/data-structures/graph/undirected-graph.d.ts +384 -59
  70. package/dist/types/data-structures/hash/hash-map.d.ts +462 -89
  71. package/dist/types/data-structures/heap/heap.d.ts +567 -99
  72. package/dist/types/data-structures/heap/max-heap.d.ts +46 -0
  73. package/dist/types/data-structures/heap/min-heap.d.ts +59 -0
  74. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +631 -49
  75. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +581 -68
  76. package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +775 -12
  77. package/dist/types/data-structures/matrix/matrix.d.ts +491 -0
  78. package/dist/types/data-structures/priority-queue/max-priority-queue.d.ts +57 -0
  79. package/dist/types/data-structures/priority-queue/min-priority-queue.d.ts +60 -0
  80. package/dist/types/data-structures/priority-queue/priority-queue.d.ts +60 -0
  81. package/dist/types/data-structures/queue/deque.d.ts +578 -71
  82. package/dist/types/data-structures/queue/queue.d.ts +451 -42
  83. package/dist/types/data-structures/stack/stack.d.ts +374 -32
  84. package/dist/types/data-structures/trie/trie.d.ts +458 -48
  85. package/dist/types/interfaces/graph.d.ts +1 -1
  86. package/dist/types/types/common.d.ts +2 -2
  87. package/dist/types/types/data-structures/binary-tree/segment-tree.d.ts +1 -1
  88. package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
  89. package/dist/types/types/data-structures/linked-list/skip-linked-list.d.ts +1 -4
  90. package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
  91. package/dist/types/types/utils/validate-type.d.ts +4 -4
  92. package/dist/umd/data-structure-typed.js +32432 -10808
  93. package/dist/umd/data-structure-typed.min.js +10 -4
  94. package/docs-site-docusaurus/README.md +41 -0
  95. package/docs-site-docusaurus/docs/api/README.md +52 -0
  96. package/docs-site-docusaurus/docs/api/classes/AVLTree.md +6130 -0
  97. package/docs-site-docusaurus/docs/api/classes/AVLTreeNode.md +282 -0
  98. package/docs-site-docusaurus/docs/api/classes/AbstractGraph.md +2266 -0
  99. package/docs-site-docusaurus/docs/api/classes/BST.md +5831 -0
  100. package/docs-site-docusaurus/docs/api/classes/BSTNode.md +333 -0
  101. package/docs-site-docusaurus/docs/api/classes/BinaryIndexedTree.md +455 -0
  102. package/docs-site-docusaurus/docs/api/classes/BinaryTree.md +4647 -0
  103. package/docs-site-docusaurus/docs/api/classes/BinaryTreeNode.md +331 -0
  104. package/docs-site-docusaurus/docs/api/classes/Deque.md +2767 -0
  105. package/docs-site-docusaurus/docs/api/classes/DirectedGraph.md +2999 -0
  106. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedList.md +2685 -0
  107. package/docs-site-docusaurus/docs/api/classes/DoublyLinkedListNode.md +221 -0
  108. package/docs-site-docusaurus/docs/api/classes/FibonacciHeap.md +253 -0
  109. package/docs-site-docusaurus/docs/api/classes/FibonacciHeapNode.md +21 -0
  110. package/docs-site-docusaurus/docs/api/classes/HashMap.md +1333 -0
  111. package/docs-site-docusaurus/docs/api/classes/Heap.md +1881 -0
  112. package/docs-site-docusaurus/docs/api/classes/IterableElementBase.md +800 -0
  113. package/docs-site-docusaurus/docs/api/classes/IterableEntryBase.md +644 -0
  114. package/docs-site-docusaurus/docs/api/classes/LinearBase.md +1632 -0
  115. package/docs-site-docusaurus/docs/api/classes/LinearLinkedBase.md +1853 -0
  116. package/docs-site-docusaurus/docs/api/classes/LinkedHashMap.md +1108 -0
  117. package/docs-site-docusaurus/docs/api/classes/LinkedListNode.md +156 -0
  118. package/docs-site-docusaurus/docs/api/classes/LinkedListQueue.md +2824 -0
  119. package/docs-site-docusaurus/docs/api/classes/MapGraph.md +2929 -0
  120. package/docs-site-docusaurus/docs/api/classes/Matrix.md +1026 -0
  121. package/docs-site-docusaurus/docs/api/classes/MaxHeap.md +1866 -0
  122. package/docs-site-docusaurus/docs/api/classes/MaxPriorityQueue.md +1883 -0
  123. package/docs-site-docusaurus/docs/api/classes/MinHeap.md +1879 -0
  124. package/docs-site-docusaurus/docs/api/classes/MinPriorityQueue.md +1882 -0
  125. package/docs-site-docusaurus/docs/api/classes/Navigator.md +109 -0
  126. package/docs-site-docusaurus/docs/api/classes/PriorityQueue.md +1839 -0
  127. package/docs-site-docusaurus/docs/api/classes/Queue.md +2244 -0
  128. package/docs-site-docusaurus/docs/api/classes/RedBlackTree.md +6374 -0
  129. package/docs-site-docusaurus/docs/api/classes/SegmentTree.md +372 -0
  130. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedList.md +2897 -0
  131. package/docs-site-docusaurus/docs/api/classes/SinglyLinkedListNode.md +169 -0
  132. package/docs-site-docusaurus/docs/api/classes/SkipList.md +1229 -0
  133. package/docs-site-docusaurus/docs/api/classes/Stack.md +1573 -0
  134. package/docs-site-docusaurus/docs/api/classes/TreeMap.md +1257 -0
  135. package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +1475 -0
  136. package/docs-site-docusaurus/docs/api/classes/TreeSet.md +1117 -0
  137. package/docs-site-docusaurus/docs/api/classes/Trie.md +1708 -0
  138. package/docs-site-docusaurus/docs/api/classes/TrieNode.md +199 -0
  139. package/docs-site-docusaurus/docs/api/classes/UndirectedGraph.md +2979 -0
  140. package/docs-site-docusaurus/docs/guide/_category_.json +6 -0
  141. package/docs-site-docusaurus/docs/guide/architecture.md +613 -0
  142. package/docs-site-docusaurus/docs/guide/concepts.md +420 -0
  143. package/docs-site-docusaurus/docs/guide/guides.md +611 -0
  144. package/docs-site-docusaurus/docs/guide/installation.md +60 -0
  145. package/docs-site-docusaurus/docs/guide/integrations.md +823 -0
  146. package/docs-site-docusaurus/docs/guide/overview.md +638 -0
  147. package/docs-site-docusaurus/docs/guide/performance.md +833 -0
  148. package/docs-site-docusaurus/docs/guide/quick-start.md +73 -0
  149. package/docs-site-docusaurus/docusaurus.config.ts +159 -0
  150. package/docs-site-docusaurus/fix-mdx-generics.mjs +75 -0
  151. package/docs-site-docusaurus/package-lock.json +18667 -0
  152. package/docs-site-docusaurus/package.json +50 -0
  153. package/docs-site-docusaurus/prefix-class-to-methods.mjs +48 -0
  154. package/docs-site-docusaurus/sidebars.ts +23 -0
  155. package/docs-site-docusaurus/sort-protected.mjs +87 -0
  156. package/docs-site-docusaurus/src/css/custom.css +96 -0
  157. package/docs-site-docusaurus/src/pages/index.module.css +13 -0
  158. package/docs-site-docusaurus/src/pages/index.tsx +71 -0
  159. package/docs-site-docusaurus/src/pages/markdown-page.md +7 -0
  160. package/docs-site-docusaurus/src/theme/TOCItems/index.tsx +34 -0
  161. package/docs-site-docusaurus/static/.nojekyll +0 -0
  162. package/docs-site-docusaurus/static/img/docusaurus-social-card.jpg +0 -0
  163. package/docs-site-docusaurus/static/img/docusaurus.png +0 -0
  164. package/docs-site-docusaurus/static/img/favicon.ico +0 -0
  165. package/docs-site-docusaurus/static/img/favicon.png +0 -0
  166. package/docs-site-docusaurus/static/img/logo-180.png +0 -0
  167. package/docs-site-docusaurus/static/img/logo.jpg +0 -0
  168. package/docs-site-docusaurus/static/img/logo.png +0 -0
  169. package/docs-site-docusaurus/static/img/logo.svg +1 -0
  170. package/docs-site-docusaurus/static/img/og-image.png +0 -0
  171. package/docs-site-docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
  172. package/docs-site-docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
  173. package/docs-site-docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
  174. package/docs-site-docusaurus/static/robots.txt +4 -0
  175. package/docs-site-docusaurus/typedoc.json +23 -0
  176. package/package.json +109 -12
  177. package/src/data-structures/base/index.ts +1 -0
  178. package/src/data-structures/base/iterable-element-base.ts +4 -5
  179. package/src/data-structures/base/iterable-entry-base.ts +8 -8
  180. package/src/data-structures/base/linear-base.ts +3 -3
  181. package/src/data-structures/binary-tree/avl-tree.ts +386 -51
  182. package/src/data-structures/binary-tree/binary-indexed-tree.ts +596 -247
  183. package/src/data-structures/binary-tree/binary-tree.ts +956 -81
  184. package/src/data-structures/binary-tree/bst.ts +840 -35
  185. package/src/data-structures/binary-tree/red-black-tree.ts +689 -97
  186. package/src/data-structures/binary-tree/segment-tree.ts +498 -249
  187. package/src/data-structures/binary-tree/tree-map.ts +3784 -7
  188. package/src/data-structures/binary-tree/tree-multi-map.ts +3614 -211
  189. package/src/data-structures/binary-tree/tree-multi-set.ts +2874 -65
  190. package/src/data-structures/binary-tree/tree-set.ts +3531 -10
  191. package/src/data-structures/graph/abstract-graph.ts +4 -4
  192. package/src/data-structures/graph/directed-graph.ts +429 -47
  193. package/src/data-structures/graph/map-graph.ts +59 -1
  194. package/src/data-structures/graph/undirected-graph.ts +393 -59
  195. package/src/data-structures/hash/hash-map.ts +476 -92
  196. package/src/data-structures/heap/heap.ts +581 -99
  197. package/src/data-structures/heap/max-heap.ts +46 -0
  198. package/src/data-structures/heap/min-heap.ts +59 -0
  199. package/src/data-structures/linked-list/doubly-linked-list.ts +646 -47
  200. package/src/data-structures/linked-list/singly-linked-list.ts +596 -68
  201. package/src/data-structures/linked-list/skip-linked-list.ts +1067 -90
  202. package/src/data-structures/matrix/matrix.ts +584 -12
  203. package/src/data-structures/priority-queue/max-priority-queue.ts +57 -0
  204. package/src/data-structures/priority-queue/min-priority-queue.ts +60 -0
  205. package/src/data-structures/priority-queue/priority-queue.ts +60 -0
  206. package/src/data-structures/queue/deque.ts +592 -70
  207. package/src/data-structures/queue/queue.ts +463 -42
  208. package/src/data-structures/stack/stack.ts +384 -32
  209. package/src/data-structures/trie/trie.ts +470 -48
  210. package/src/interfaces/graph.ts +1 -1
  211. package/src/types/common.ts +2 -2
  212. package/src/types/data-structures/binary-tree/segment-tree.ts +1 -1
  213. package/src/types/data-structures/heap/heap.ts +1 -0
  214. package/src/types/data-structures/linked-list/skip-linked-list.ts +2 -1
  215. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
  216. package/src/types/utils/validate-type.ts +4 -4
  217. package/vercel.json +6 -0
  218. package/dist/leetcode/avl-tree-counter.mjs +0 -2957
  219. package/dist/leetcode/avl-tree-multi-map.mjs +0 -2889
  220. package/dist/leetcode/avl-tree.mjs +0 -2720
  221. package/dist/leetcode/binary-tree.mjs +0 -1594
  222. package/dist/leetcode/bst.mjs +0 -2398
  223. package/dist/leetcode/deque.mjs +0 -683
  224. package/dist/leetcode/directed-graph.mjs +0 -1733
  225. package/dist/leetcode/doubly-linked-list.mjs +0 -709
  226. package/dist/leetcode/hash-map.mjs +0 -493
  227. package/dist/leetcode/heap.mjs +0 -542
  228. package/dist/leetcode/max-heap.mjs +0 -375
  229. package/dist/leetcode/max-priority-queue.mjs +0 -383
  230. package/dist/leetcode/min-heap.mjs +0 -363
  231. package/dist/leetcode/min-priority-queue.mjs +0 -371
  232. package/dist/leetcode/priority-queue.mjs +0 -363
  233. package/dist/leetcode/queue.mjs +0 -943
  234. package/dist/leetcode/red-black-tree.mjs +0 -2765
  235. package/dist/leetcode/singly-linked-list.mjs +0 -754
  236. package/dist/leetcode/stack.mjs +0 -217
  237. package/dist/leetcode/tree-counter.mjs +0 -3039
  238. package/dist/leetcode/tree-multi-map.mjs +0 -2913
  239. package/dist/leetcode/trie.mjs +0 -413
  240. package/dist/leetcode/undirected-graph.mjs +0 -1650
@@ -0,0 +1,611 @@
1
+ ---
2
+ sidebar_label: "GUIDES"
3
+ description: "Real-world examples: leaderboards with RedBlackTree, task scheduling with PriorityQueue, autocomplete with Trie, and more."
4
+ ---
5
+
6
+ # GUIDES
7
+
8
+ Production-ready code examples for common use cases. Learn by doing.
9
+
10
+ **[Back to README](/.md) • [API Docs](https://data-structure-typed-docs.vercel.app/) • [See INTEGRATIONS](/guide/integrations.md)**
11
+
12
+ ---
13
+
14
+ ## Table of Contents
15
+
16
+ 1. [Design Patterns](#design-patterns)
17
+ 2. [Real-World Examples](#real-world-examples)
18
+ 3. [Common Mistakes](#common-mistakes)
19
+ 4. [Best Practices](#best-practices)
20
+
21
+ ---
22
+
23
+ ## Design Patterns
24
+
25
+ ### Pattern 1: Iterator Pattern (Zero Conversions)
26
+
27
+ ```typescript
28
+ import { RedBlackTree } from 'data-structure-typed';
29
+
30
+ // Problem: Need to work with sorted data in multiple ways
31
+ const scores = [95, 23, 67, 89, 12, 45];
32
+
33
+ // Solution: Use iterator protocol
34
+ const tree = new RedBlackTree(scores);
35
+
36
+ // Method 1: Spread operator
37
+ const sorted = [...tree.keys()];
38
+ console.log(sorted); // [12, 23, 45, 67, 89, 95]
39
+
40
+ // Method 2: for...of loop
41
+ for (const [score] of tree) {
42
+ console.log(score);
43
+ }
44
+
45
+ // Method 3: Destructuring
46
+ const [min, ...rest] = tree.keys();
47
+
48
+ // Method 4: Set constructor
49
+ const unique = new Set(tree.keys());
50
+
51
+ // Method 5: Array.from()
52
+ const array = Array.from(tree.keys());
53
+
54
+ // All work automatically - zero conversions!
55
+ ```
56
+
57
+ ### Pattern 2: Method Chaining (Stay on Structure)
58
+
59
+ ```typescript
60
+ import { RedBlackTree } from 'data-structure-typed';
61
+
62
+ const tree = new RedBlackTree([
63
+ [1, { name: 'Alice', score: 95 }],
64
+ [2, { name: 'Bob', score: 45 }],
65
+ [3, { name: 'Charlie', score: 87 }],
66
+ ]);
67
+
68
+ // Chain operations - structure maintained throughout
69
+ const result = tree
70
+ .filter((student, id) => (student?.score ?? 0) >= 50)
71
+ .map((student, id) => ([id, {
72
+ id,
73
+ name: student?.name,
74
+ passed: (student?.score ?? 0) >= 50
75
+ }]))
76
+ .reduce((summary, student) => {
77
+ summary.count++;
78
+ summary.names.push(student?.name ?? '');
79
+ return summary;
80
+ }, { count: 0, names: [] as string[] });
81
+
82
+ console.log(result);
83
+ // { count: 2, names: ['Alice', 'Charlie'] }
84
+ ```
85
+
86
+ ### Pattern 3: Seamless Structure Conversion
87
+
88
+ ```typescript
89
+ import { RedBlackTree, Deque, MaxHeap } from 'data-structure-typed';
90
+
91
+ const data = [64, 34, 25, 12, 22, 11, 90];
92
+
93
+ // Convert between structures instantly
94
+ const tree = new RedBlackTree(data);
95
+ const sorted = [...tree.keys()]; // [11, 12, 22, 25, 34, 64, 90]
96
+
97
+ const heap = new MaxHeap(sorted);
98
+ const byPriority = [...heap]; // [90, 64, 34, ...]
99
+
100
+ const deque = new Deque(byPriority);
101
+ const processed = deque.shift(); // Remove first - O(1)!
102
+
103
+ // No intermediate conversions, structure preserved when possible
104
+ ```
105
+
106
+ ### Pattern 4: Conditional Logic with Types
107
+
108
+ ```typescript
109
+ import { RedBlackTree } from 'data-structure-typed';
110
+
111
+ interface Product {
112
+ id: string;
113
+ name: string;
114
+ price: number;
115
+ }
116
+
117
+ class PriceIndex {
118
+ private index = new RedBlackTree<number, Product>([], {isMapMode: false});
119
+
120
+ addProduct(product: Product) {
121
+ this.index.set(product.price, product);
122
+ }
123
+
124
+ getByPriceRange(min: number, max: number) {
125
+ return this.index.rangeSearch([min, max], node => node.value)
126
+ }
127
+
128
+ getAffordable(budget: number) {
129
+ return this.index.rangeSearch([0, budget], node => node.value)
130
+ }
131
+ }
132
+
133
+ const index = new PriceIndex();
134
+ index.addProduct({id: '1', name: 'Laptop', price: 999});
135
+ index.addProduct({id: '2', name: 'Mouse', price: 25});
136
+
137
+ const affordable = index.getAffordable(100);
138
+ ```
139
+
140
+ ### Pattern 5: High-Throughput Insertions with Hints (RedBlackTree)
141
+
142
+ If you insert keys in sorted or nearly-sorted order (timestamps, auto-increment IDs, etc.),
143
+ `setWithHintNode()` can avoid repeated full root-to-leaf searches.
144
+
145
+ ```typescript
146
+ import { RedBlackTree } from 'data-structure-typed';
147
+ import type { RedBlackTreeNode } from 'data-structure-typed';
148
+
149
+ const tree = new RedBlackTree<number, number>([], { isMapMode: true });
150
+
151
+ let hint: RedBlackTreeNode<number, number> | undefined;
152
+ for (let i = 0; i < 1_000_000; i++) {
153
+ hint = tree.setWithHintNode(i, i, hint);
154
+ }
155
+
156
+ // tree.size === 1_000_000
157
+ ```
158
+
159
+ Notes:
160
+ - Pass the **last returned node** as the hint.
161
+ - If the hint is not valid for the key, the implementation safely falls back to normal `set()`.
162
+
163
+ ---
164
+
165
+ ## Real-World Examples
166
+
167
+ ### Example 1: LRU Cache
168
+
169
+ ```typescript
170
+ import { DoublyLinkedList } from 'data-structure-typed';
171
+
172
+ class LRUCache<K, V> {
173
+ private cache = new Map<K, { value: V; node: any }>();
174
+ private order = new DoublyLinkedList<K>();
175
+ private readonly capacity: number;
176
+
177
+ constructor(capacity: number) {
178
+ this.capacity = capacity;
179
+ }
180
+
181
+ get(key: K): V | null {
182
+ if (!this.cache.has(key)) return null;
183
+
184
+ const {value, node} = this.cache.get(key)!;
185
+
186
+ // Move to end (most recently used)
187
+ this.order.delete(node);
188
+ const newNode = this.order.push(key);
189
+ this.cache.set(key, {value, node: newNode});
190
+
191
+ return value;
192
+ }
193
+
194
+ set(key: K, value: V): void {
195
+ if (this.cache.has(key)) {
196
+ this.get(key); // Mark as recently used
197
+ this.cache.set(key, {value, node: this.cache.get(key)!.node});
198
+ return;
199
+ }
200
+
201
+ if (this.cache.size >= this.capacity) {
202
+ // Evict least recently used
203
+ const lru = this.order.shift();
204
+ if (lru) this.cache.delete(lru);
205
+ }
206
+
207
+ const node = this.order.push(key);
208
+ this.cache.set(key, {value, node});
209
+ }
210
+ }
211
+
212
+ // Usage
213
+ const cache = new LRUCache<string, string>(3);
214
+ cache.set('a', 'value1');
215
+ cache.set('b', 'value2');
216
+ cache.set('c', 'value3');
217
+ console.log(cache.get('a')); // 'value1', 'a' is now most recent
218
+ cache.set('d', 'value4'); // Evicts 'b' (least recent)
219
+ ```
220
+
221
+ ### Example 2: Real-Time Leaderboard
222
+
223
+ ```typescript
224
+ import { RedBlackTree } from 'data-structure-typed';
225
+ // TODO
226
+ interface Player {
227
+ id: string;
228
+ name: string;
229
+ score: number;
230
+ }
231
+
232
+ class Leaderboard {
233
+ private scores = new RedBlackTree<number, Player>(
234
+ (a, b) => b - a // Descending order
235
+ );
236
+ private players = new Map<string, number>(); // playerId → currentScore
237
+
238
+ updateScore(player: Player): void {
239
+ // Remove old score if exists
240
+ if (this.players.has(player.id)) {
241
+ const oldScore = this.players.get(player.id)!;
242
+ this.scores.delete(oldScore);
243
+ }
244
+
245
+ // Add new score
246
+ this.scores.set(player.score, player);
247
+ this.players.set(player.id, player.score);
248
+ }
249
+
250
+ // O(k log n) — walk from highest score, no array copy
251
+ getTopN(n: number): Player[] {
252
+ const result: Player[] = [];
253
+ let key = this.scores.getLeftMost(); // highest in desc tree
254
+ while (key !== undefined && result.length < n) {
255
+ const player = this.scores.get(key);
256
+ if (player) result.push(player);
257
+ key = this.scores.higher(key); // next in tree order
258
+ }
259
+ return result;
260
+ }
261
+
262
+ // O(log n + k) — count entries above the target score
263
+ getRank(playerId: string): number {
264
+ if (!this.players.has(playerId)) return -1;
265
+ const score = this.players.get(playerId)!;
266
+ let rank = 1;
267
+ let key = this.scores.getLeftMost();
268
+ while (key !== undefined && key > score) {
269
+ rank++;
270
+ key = this.scores.higher(key);
271
+ }
272
+ return rank;
273
+ }
274
+
275
+ // O(log n + k) — navigate to target player, then walk ±range
276
+ getAroundMe(playerId: string, range: number): Player[] {
277
+ if (!this.players.has(playerId)) return [];
278
+ const myScore = this.players.get(playerId)!;
279
+ const result: Player[] = [];
280
+
281
+ // Collect `range` players above me
282
+ const above: Player[] = [];
283
+ let key = this.scores.lower(myScore);
284
+ for (let i = 0; i < range && key !== undefined; i++) {
285
+ const p = this.scores.get(key);
286
+ if (p) above.unshift(p);
287
+ key = this.scores.lower(key);
288
+ }
289
+
290
+ // Me + `range` players below me
291
+ result.push(...above);
292
+ const me = this.scores.get(myScore);
293
+ if (me) result.push(me);
294
+
295
+ key = this.scores.higher(myScore);
296
+ for (let i = 0; i < range && key !== undefined; i++) {
297
+ const p = this.scores.get(key);
298
+ if (p) result.push(p);
299
+ key = this.scores.higher(key);
300
+ }
301
+
302
+ return result;
303
+ }
304
+ }
305
+
306
+ // Usage
307
+ const lb = new Leaderboard();
308
+ lb.updateScore({ id: '1', name: 'Alice', score: 1000 });
309
+ lb.updateScore({ id: '2', name: 'Bob', score: 900 });
310
+ lb.updateScore({ id: '3', name: 'Charlie', score: 950 });
311
+
312
+ console.log(lb.getTopN(2)); // Top 2 players
313
+ console.log(lb.getRank('2')); // Bob's rank
314
+ console.log(lb.getAroundMe('2', 1)); // Players around Bob
315
+ ```
316
+
317
+ ### Example 3: Message Queue with Priorities
318
+
319
+ ```typescript
320
+ import { Deque, MaxPriorityQueue } from 'data-structure-typed';
321
+
322
+ interface Message {
323
+ id: string;
324
+ content: string;
325
+ priority: number;
326
+ timestamp: number;
327
+ }
328
+
329
+ class PriorityMessageQueue {
330
+ private urgent = new Deque<Message>(); // Priority >= 8
331
+ private normal = new Deque<Message>(); // Priority 4-7
332
+ private low = new Deque<Message>(); // Priority < 4
333
+
334
+ enqueue(message: Message): void {
335
+ if (message.priority >= 8) {
336
+ this.urgent.push(message);
337
+ } else if (message.priority >= 4) {
338
+ this.normal.push(message);
339
+ } else {
340
+ this.low.push(message);
341
+ }
342
+ }
343
+
344
+ dequeue(): Message | null {
345
+ // Serve urgent first, then normal, then low
346
+ return (
347
+ this.urgent.shift() ||
348
+ this.normal.shift() ||
349
+ this.low.shift() ||
350
+ null
351
+ );
352
+ }
353
+
354
+ length(): number {
355
+ return this.urgent.length + this.normal.length + this.low.length;
356
+ }
357
+ }
358
+
359
+ // Usage
360
+ const queue = new PriorityMessageQueue();
361
+ queue.enqueue({ id: '1', content: 'Normal task', priority: 5, timestamp: Date.now() });
362
+ queue.enqueue({ id: '2', content: 'Urgent task', priority: 9, timestamp: Date.now() });
363
+ queue.enqueue({ id: '3', content: 'Low task', priority: 1, timestamp: Date.now() });
364
+
365
+ while (queue.length() > 0) {
366
+ const msg = queue.dequeue();
367
+ console.log(msg?.id); // 2, 1, 3 (urgent first)
368
+ }
369
+ ```
370
+
371
+ ### Example 4: Task Scheduler
372
+
373
+ ```typescript
374
+ interface Task {
375
+ id: string;
376
+ action: () => Promise<void>;
377
+ priority: number;
378
+ scheduledTime: number;
379
+ }
380
+
381
+ class TaskScheduler {
382
+ private queue = new MaxPriorityQueue<Task>([], {
383
+ comparator: (a, b) => a.priority - b.priority
384
+ });
385
+ private running = false;
386
+
387
+ scheduleTask(task: Task): void {
388
+ this.queue.add(task);
389
+ if (!this.running) void this.start();
390
+ }
391
+
392
+ private async start(): Promise<void> {
393
+ this.running = true;
394
+
395
+ while (!this.queue.isEmpty()) {
396
+ const task = this.queue.poll();
397
+ if (!task) break;
398
+
399
+ try {
400
+ console.log(`Executing task ${task.id}`);
401
+ await task.action();
402
+ } catch (error) {
403
+ console.error(`Task ${task.id} failed:`, error);
404
+ }
405
+ }
406
+
407
+ this.running = false;
408
+ }
409
+ }
410
+
411
+ // Usage
412
+ const scheduler = new TaskScheduler();
413
+ scheduler.scheduleTask({
414
+ id: '1',
415
+ action: async () => console.log('High priority'),
416
+ priority: 10,
417
+ scheduledTime: Date.now()
418
+ });
419
+ scheduler.scheduleTask({
420
+ id: '2',
421
+ action: async () => console.log('Low priority'),
422
+ priority: 1,
423
+ scheduledTime: Date.now()
424
+ });
425
+ ```
426
+
427
+ ### Example 5: Search Index with Autocomplete
428
+
429
+ ```typescript
430
+ import {Trie} from 'data-structure-typed';
431
+
432
+ class SearchIndex {
433
+ private trie = new Trie();
434
+ private documents = new Map<string, string[]>();
435
+
436
+ indexDocument(docId: string, content: string): void {
437
+ const words = content.toLowerCase().split(/\s+/);
438
+
439
+ for (const word of words) {
440
+ // Insert word into trie
441
+ if (!this.trie.has(word)) {
442
+ this.trie.add(word);
443
+ }
444
+
445
+ // Track which documents contain this word
446
+ if (!this.documents.has(word)) {
447
+ this.documents.set(word, []);
448
+ }
449
+ this.documents.get(word)!.push(docId);
450
+ }
451
+ }
452
+
453
+ autocomplete(prefix: string): string[] {
454
+ const words = this.trie.getWords(prefix);
455
+ return words.filter((_word, index) => index < 10); // Top 10
456
+ }
457
+
458
+ search(query: string): string[] {
459
+ const word = query.toLowerCase();
460
+ return this.documents.get(word) || [];
461
+ }
462
+ }
463
+
464
+ // Usage
465
+ const index = new SearchIndex();
466
+ index.indexDocument('doc1', 'apple application');
467
+ index.indexDocument('doc2', 'app store');
468
+
469
+ console.log(index.autocomplete('app')); // ['apple', 'application', 'app']
470
+ console.log(index.search('apple')); // ['doc1']
471
+ ```
472
+
473
+ ---
474
+
475
+ ## Common Mistakes
476
+
477
+ ### Mistake 1: Forgetting to Convert Back
478
+
479
+ ```typescript
480
+ // ❌ Wrong
481
+ const tree = new RedBlackTree([5, 2, 8]);
482
+ const doubled = tree.map((_v, k) => [k * 2, undefined]); // Still a tree!
483
+ JSON.stringify(doubled); // Error or wrong output
484
+ ```
485
+
486
+ ```typescript
487
+ // ✅ Right
488
+ const tree = new RedBlackTree([5, 2, 8]);
489
+ const doubled = tree.map((_v, k) => [k * 2, undefined]);
490
+ JSON.stringify([...doubled.keys()]); // [4, 10, 16]
491
+ ```
492
+
493
+ ### Mistake 2: Mutating During Iteration
494
+
495
+ ```typescript
496
+ // ❌ Wrong
497
+ const tree = new RedBlackTree([1, 2, 3, 4, 5, 6]);
498
+ for (const [key, _value] of tree) {
499
+ if (key % 2 === 0) tree.delete(key); // Avoid this!
500
+ }
501
+ ```
502
+
503
+ ```typescript
504
+ // ✅ Right
505
+ const tree = new RedBlackTree([1, 2, 3, 4, 5, 6]);
506
+ const toDelete = [];
507
+ for (const [key, _value] of tree) {
508
+ if (key % 2 === 0) toDelete.push(key);
509
+ }
510
+ toDelete.forEach(v => tree.delete(v));
511
+ ```
512
+
513
+ ```typescript
514
+ // ✅ Perfect
515
+ const tree = new RedBlackTree([1, 2, 3, 4, 5, 6]);
516
+ tree.deleteWhere((node) => node.key % 2 === 0);
517
+ ```
518
+
519
+ ### Mistake 3: Wrong Data Structure Choice
520
+
521
+ ```typescript
522
+ // ❌ Wrong - using Array for sorted data with updates
523
+ const scores = [];
524
+ function addScore(score) {
525
+ scores.push(score);
526
+ scores.sort((a, b) => b - a); // O(n log n) every time!
527
+ }
528
+ ```
529
+
530
+ ```typescript
531
+ // ✅ Right - using RedBlackTree
532
+ const scores = new RedBlackTree();
533
+ function addScore(score) {
534
+ scores.set(score, true); // O(log n), auto-sorted
535
+ }
536
+ ```
537
+
538
+ ---
539
+
540
+ ## Best Practices
541
+
542
+ ### 1. Choose Structure Early
543
+
544
+ ```typescript
545
+ // ❌ Bad: Convert later
546
+ function processScores(scores: number[]) {
547
+ const sorted = [...scores].sort((a, b) => b - a);
548
+ return new RedBlackTree(sorted).filter(x => x > 50); // Redundant
549
+ }
550
+ ```
551
+
552
+ ```typescript
553
+ // ✅ Good: Decide upfront
554
+ function processScores(scores: number[]) {
555
+ const tree = new RedBlackTree(scores); // Already sorted
556
+ return tree.filter(x => x > 50).map((_v,k) => [k * 1.1, undefined]);
557
+ }
558
+ ```
559
+
560
+ ### 2. Batch Operations When Possible
561
+
562
+ ```typescript
563
+ // ❌ Bad: Individual inserts
564
+ const tree = new RedBlackTree();
565
+ for (const item of largeDataset) {
566
+ tree.set(item.id, item); // Rebalances each time
567
+ }
568
+ ```
569
+
570
+ ```typescript
571
+ // ✅ Good: Bulk insert
572
+ const tree = new RedBlackTree(largeDataset);
573
+ ```
574
+
575
+ ### 3. Use Type Safety
576
+
577
+ ```typescript
578
+ // ❌ Bad: No type checking
579
+ const tree = new RedBlackTree();
580
+ tree.set(1, { id: 1, name: 'Alice' });
581
+ ```
582
+
583
+ ```typescript
584
+ // ✅ Good: Full type inference
585
+ const tree = new RedBlackTree<number, User>();
586
+ tree.set(1, { id: 1, name: 'Alice' });
587
+ ```
588
+
589
+ ### 4. Chain When Possible
590
+
591
+ ```typescript
592
+ // ❌ Bad: Convert unnecessarily
593
+ const result = [...tree]
594
+ .filter(x => x > 10)
595
+ .map(x => x * 2)
596
+ .reduce((sum, x) => sum + x, 0);
597
+ ```
598
+
599
+ ```typescript
600
+ // ✅ Good: Stay on structure
601
+ const result = tree
602
+ .filter(v => v > 10)
603
+ .map(v => [(v ?? 0) * 2, undefined])
604
+ .reduce((sum, v) => sum + (v ?? 0), 0);
605
+ ```
606
+
607
+ ---
608
+
609
+ **Need more?** Check [INTEGRATIONS.md](/guide/integrations.md) for framework examples.
610
+
611
+ **Performance questions?** See [PERFORMANCE.md](/guide/performance.md).
@@ -0,0 +1,60 @@
1
+ ---
2
+ description: "Install data-structure-typed via npm, yarn, or pnpm. Supports tree-shaking with subpath imports for minimal bundle size."
3
+ ---
4
+
5
+ # Installation
6
+
7
+ ## Package Manager
8
+
9
+ ::: code-group
10
+
11
+ ```bash [npm]
12
+ npm i data-structure-typed
13
+ ```
14
+
15
+ ```bash [yarn]
16
+ yarn add data-structure-typed
17
+ ```
18
+
19
+ ```bash [pnpm]
20
+ pnpm add data-structure-typed
21
+ ```
22
+
23
+ :::
24
+
25
+ ## Subpath Imports
26
+
27
+ Import only the category you need for smaller bundles:
28
+
29
+ ```typescript
30
+ import { RedBlackTree, TreeMap } from 'data-structure-typed/binary-tree';
31
+ import { Deque, Queue } from 'data-structure-typed/queue';
32
+ import { HashMap } from 'data-structure-typed/hash';
33
+ import { Heap, MinHeap } from 'data-structure-typed/heap';
34
+ import { Trie } from 'data-structure-typed/trie';
35
+ import { Stack } from 'data-structure-typed/stack';
36
+ ```
37
+
38
+ ::: tip Tree-Shaking
39
+ With `"sideEffects": false` and modern bundlers (Vite, Webpack 5, Rollup), even the full import `from 'data-structure-typed'` will tree-shake unused structures. Subpath imports give you explicit control and faster IDE autocomplete.
40
+ :::
41
+
42
+ ## Individual Packages
43
+
44
+ Standalone packages are also available:
45
+
46
+ ```bash
47
+ npm i avl-tree-typed bst-typed heap-typed
48
+ ```
49
+
50
+ ## CDN
51
+
52
+ ```html
53
+ <script src="https://unpkg.com/data-structure-typed/dist/umd/data-structure-typed.min.js"></script>
54
+ ```
55
+
56
+ ## Requirements
57
+
58
+ - **Node.js** ≥ 16
59
+ - **TypeScript** ≥ 4.8 (optional, for type support)
60
+ - **Browser**: Any modern browser (ES2018+)