data-structure-typed 1.51.8 → 1.52.0

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 (216) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +13 -13
  3. package/benchmark/report.html +13 -13
  4. package/benchmark/report.json +152 -152
  5. package/dist/cjs/data-structures/base/index.d.ts +2 -1
  6. package/dist/cjs/data-structures/base/index.js +2 -1
  7. package/dist/cjs/data-structures/base/index.js.map +1 -1
  8. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +171 -0
  9. package/dist/cjs/data-structures/base/iterable-element-base.js +226 -0
  10. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -0
  11. package/dist/cjs/data-structures/base/{iterable-base.d.ts → iterable-entry-base.d.ts} +4 -147
  12. package/dist/cjs/data-structures/base/{iterable-base.js → iterable-entry-base.js} +13 -190
  13. package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -0
  14. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +106 -68
  15. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +119 -87
  16. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  17. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
  18. package/dist/cjs/data-structures/binary-tree/avl-tree.js +78 -59
  19. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  20. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +318 -226
  21. package/dist/cjs/data-structures/binary-tree/binary-tree.js +475 -363
  22. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  23. package/dist/cjs/data-structures/binary-tree/bst.d.ts +192 -202
  24. package/dist/cjs/data-structures/binary-tree/bst.js +207 -249
  25. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  26. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +73 -74
  27. package/dist/cjs/data-structures/binary-tree/rb-tree.js +107 -98
  28. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  29. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -75
  30. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +105 -93
  31. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  32. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +10 -15
  33. package/dist/cjs/data-structures/graph/abstract-graph.js +10 -15
  34. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  35. package/dist/cjs/data-structures/hash/hash-map.d.ts +33 -40
  36. package/dist/cjs/data-structures/hash/hash-map.js +40 -55
  37. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  38. package/dist/cjs/data-structures/heap/heap.d.ts +43 -114
  39. package/dist/cjs/data-structures/heap/heap.js +59 -127
  40. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  41. package/dist/cjs/data-structures/heap/max-heap.d.ts +50 -4
  42. package/dist/cjs/data-structures/heap/max-heap.js +76 -10
  43. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  44. package/dist/cjs/data-structures/heap/min-heap.d.ts +51 -5
  45. package/dist/cjs/data-structures/heap/min-heap.js +68 -11
  46. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  47. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +22 -28
  48. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +26 -28
  49. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  50. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +22 -25
  51. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +29 -26
  52. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  53. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +50 -4
  54. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +79 -10
  55. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  56. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +51 -5
  57. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +71 -11
  58. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  59. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +50 -4
  60. package/dist/cjs/data-structures/priority-queue/priority-queue.js +70 -1
  61. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  62. package/dist/cjs/data-structures/queue/deque.d.ts +21 -20
  63. package/dist/cjs/data-structures/queue/deque.js +29 -23
  64. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  65. package/dist/cjs/data-structures/queue/queue.d.ts +8 -28
  66. package/dist/cjs/data-structures/queue/queue.js +15 -31
  67. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  68. package/dist/cjs/data-structures/stack/stack.d.ts +17 -22
  69. package/dist/cjs/data-structures/stack/stack.js +25 -24
  70. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  71. package/dist/cjs/data-structures/trie/trie.d.ts +19 -14
  72. package/dist/cjs/data-structures/trie/trie.js +27 -16
  73. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  74. package/dist/cjs/interfaces/binary-tree.d.ts +7 -7
  75. package/dist/cjs/types/common.d.ts +1 -2
  76. package/dist/cjs/types/data-structures/base/base.d.ts +5 -2
  77. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -4
  78. package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -4
  79. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +5 -5
  80. package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +4 -5
  81. package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -4
  82. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
  83. package/dist/cjs/types/data-structures/heap/heap.d.ts +3 -2
  84. package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -1
  85. package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -1
  86. package/dist/cjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
  87. package/dist/cjs/types/data-structures/queue/deque.d.ts +3 -2
  88. package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -1
  89. package/dist/cjs/types/data-structures/stack/stack.d.ts +2 -1
  90. package/dist/cjs/types/data-structures/trie/trie.d.ts +3 -2
  91. package/dist/cjs/utils/utils.js +3 -5
  92. package/dist/cjs/utils/utils.js.map +1 -1
  93. package/dist/mjs/data-structures/base/index.d.ts +2 -1
  94. package/dist/mjs/data-structures/base/index.js +2 -1
  95. package/dist/mjs/data-structures/base/iterable-element-base.d.ts +171 -0
  96. package/dist/mjs/data-structures/base/iterable-element-base.js +222 -0
  97. package/dist/mjs/data-structures/base/{iterable-base.d.ts → iterable-entry-base.d.ts} +4 -147
  98. package/dist/mjs/data-structures/base/{iterable-base.js → iterable-entry-base.js} +10 -186
  99. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +106 -68
  100. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +119 -87
  101. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
  102. package/dist/mjs/data-structures/binary-tree/avl-tree.js +78 -59
  103. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +318 -226
  104. package/dist/mjs/data-structures/binary-tree/binary-tree.js +476 -364
  105. package/dist/mjs/data-structures/binary-tree/bst.d.ts +192 -202
  106. package/dist/mjs/data-structures/binary-tree/bst.js +211 -255
  107. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +73 -74
  108. package/dist/mjs/data-structures/binary-tree/rb-tree.js +107 -98
  109. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -75
  110. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +105 -93
  111. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +10 -15
  112. package/dist/mjs/data-structures/graph/abstract-graph.js +10 -15
  113. package/dist/mjs/data-structures/hash/hash-map.d.ts +33 -40
  114. package/dist/mjs/data-structures/hash/hash-map.js +41 -55
  115. package/dist/mjs/data-structures/heap/heap.d.ts +43 -114
  116. package/dist/mjs/data-structures/heap/heap.js +60 -128
  117. package/dist/mjs/data-structures/heap/max-heap.d.ts +50 -4
  118. package/dist/mjs/data-structures/heap/max-heap.js +79 -10
  119. package/dist/mjs/data-structures/heap/min-heap.d.ts +51 -5
  120. package/dist/mjs/data-structures/heap/min-heap.js +68 -11
  121. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +22 -28
  122. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +26 -28
  123. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +22 -25
  124. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +29 -26
  125. package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +50 -4
  126. package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +82 -10
  127. package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +51 -5
  128. package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +71 -11
  129. package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +50 -4
  130. package/dist/mjs/data-structures/priority-queue/priority-queue.js +70 -1
  131. package/dist/mjs/data-structures/queue/deque.d.ts +21 -20
  132. package/dist/mjs/data-structures/queue/deque.js +29 -23
  133. package/dist/mjs/data-structures/queue/queue.d.ts +8 -28
  134. package/dist/mjs/data-structures/queue/queue.js +15 -31
  135. package/dist/mjs/data-structures/stack/stack.d.ts +17 -22
  136. package/dist/mjs/data-structures/stack/stack.js +25 -24
  137. package/dist/mjs/data-structures/trie/trie.d.ts +19 -14
  138. package/dist/mjs/data-structures/trie/trie.js +27 -16
  139. package/dist/mjs/interfaces/binary-tree.d.ts +7 -7
  140. package/dist/mjs/types/common.d.ts +1 -2
  141. package/dist/mjs/types/data-structures/base/base.d.ts +5 -2
  142. package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -4
  143. package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -4
  144. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +5 -5
  145. package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +4 -5
  146. package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -4
  147. package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
  148. package/dist/mjs/types/data-structures/heap/heap.d.ts +3 -2
  149. package/dist/mjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -1
  150. package/dist/mjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -1
  151. package/dist/mjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
  152. package/dist/mjs/types/data-structures/queue/deque.d.ts +3 -2
  153. package/dist/mjs/types/data-structures/queue/queue.d.ts +2 -1
  154. package/dist/mjs/types/data-structures/stack/stack.d.ts +2 -1
  155. package/dist/mjs/types/data-structures/trie/trie.d.ts +3 -2
  156. package/dist/mjs/utils/utils.js +3 -5
  157. package/dist/umd/data-structure-typed.js +1949 -1481
  158. package/dist/umd/data-structure-typed.min.js +2 -2
  159. package/dist/umd/data-structure-typed.min.js.map +1 -1
  160. package/package.json +6 -6
  161. package/src/data-structures/base/index.ts +2 -1
  162. package/src/data-structures/base/iterable-element-base.ts +250 -0
  163. package/src/data-structures/base/{iterable-base.ts → iterable-entry-base.ts} +22 -213
  164. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +144 -95
  165. package/src/data-structures/binary-tree/avl-tree.ts +96 -69
  166. package/src/data-structures/binary-tree/binary-tree.ts +535 -403
  167. package/src/data-structures/binary-tree/bst.ts +247 -277
  168. package/src/data-structures/binary-tree/rb-tree.ts +123 -103
  169. package/src/data-structures/binary-tree/tree-multi-map.ts +127 -102
  170. package/src/data-structures/graph/abstract-graph.ts +10 -10
  171. package/src/data-structures/hash/hash-map.ts +46 -53
  172. package/src/data-structures/heap/heap.ts +71 -152
  173. package/src/data-structures/heap/max-heap.ts +88 -13
  174. package/src/data-structures/heap/min-heap.ts +78 -15
  175. package/src/data-structures/linked-list/doubly-linked-list.ts +32 -32
  176. package/src/data-structures/linked-list/singly-linked-list.ts +37 -29
  177. package/src/data-structures/priority-queue/max-priority-queue.ts +94 -13
  178. package/src/data-structures/priority-queue/min-priority-queue.ts +84 -15
  179. package/src/data-structures/priority-queue/priority-queue.ts +81 -4
  180. package/src/data-structures/queue/deque.ts +37 -26
  181. package/src/data-structures/queue/queue.ts +23 -36
  182. package/src/data-structures/stack/stack.ts +31 -26
  183. package/src/data-structures/trie/trie.ts +35 -20
  184. package/src/interfaces/binary-tree.ts +9 -9
  185. package/src/types/common.ts +1 -2
  186. package/src/types/data-structures/base/base.ts +14 -6
  187. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +3 -4
  188. package/src/types/data-structures/binary-tree/avl-tree.ts +3 -4
  189. package/src/types/data-structures/binary-tree/binary-tree.ts +6 -6
  190. package/src/types/data-structures/binary-tree/bst.ts +4 -5
  191. package/src/types/data-structures/binary-tree/rb-tree.ts +3 -4
  192. package/src/types/data-structures/binary-tree/tree-multi-map.ts +3 -4
  193. package/src/types/data-structures/heap/heap.ts +4 -1
  194. package/src/types/data-structures/linked-list/doubly-linked-list.ts +3 -1
  195. package/src/types/data-structures/linked-list/singly-linked-list.ts +3 -1
  196. package/src/types/data-structures/priority-queue/priority-queue.ts +1 -1
  197. package/src/types/data-structures/queue/deque.ts +3 -1
  198. package/src/types/data-structures/queue/queue.ts +3 -1
  199. package/src/types/data-structures/stack/stack.ts +3 -1
  200. package/src/types/data-structures/trie/trie.ts +3 -1
  201. package/src/utils/utils.ts +3 -3
  202. package/test/integration/avl-tree.test.ts +2 -2
  203. package/test/integration/bst.test.ts +3 -3
  204. package/test/integration/index.html +25 -11
  205. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +68 -0
  206. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +56 -0
  207. package/test/unit/data-structures/graph/directed-graph.test.ts +2 -2
  208. package/test/unit/data-structures/heap/heap.test.ts +80 -0
  209. package/test/unit/data-structures/heap/max-heap.test.ts +44 -1
  210. package/test/unit/data-structures/heap/min-heap.test.ts +18 -1
  211. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +42 -0
  212. package/test/unit/data-structures/queue/deque.test.ts +30 -0
  213. package/test/unit/data-structures/queue/queue.test.ts +56 -0
  214. package/test/utils/big-o.ts +12 -6
  215. package/tsconfig-base.json +1 -0
  216. package/dist/cjs/data-structures/base/iterable-base.js.map +0 -1
@@ -1,12 +1,11 @@
1
1
  import { BST, BSTNode } from '../../../data-structures';
2
2
  import type { BinaryTreeOptions } from './binary-tree';
3
- import { Comparator } from "../../common";
4
- import { Comparable } from "../../utils";
3
+ import { Comparator } from '../../common';
5
4
 
6
- export type BSTNodeNested<K extends Comparable, V> = BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5
+ export type BSTNodeNested<K, V> = BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
6
 
8
- export type BSTNested<K extends Comparable, V, N extends BSTNode<K, V, N>> = BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, BST<K, V, N, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
7
+ export type BSTNested<K, V, R, NODE extends BSTNode<K, V, NODE>> = BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
9
8
 
10
- export type BSTOptions<K> = BinaryTreeOptions & {
9
+ export type BSTOptions<K, V, R> = BinaryTreeOptions<K, V, R> & {
11
10
  comparator?: Comparator<K>
12
11
  }
@@ -1,11 +1,10 @@
1
1
  import { RedBlackTree, RedBlackTreeNode } from '../../../data-structures';
2
2
  import type { BSTOptions } from "./bst";
3
- import { Comparable } from "../../utils";
4
3
 
5
4
  export type RBTNColor = 'RED' | 'BLACK';
6
5
 
7
- export type RedBlackTreeNodeNested<K extends Comparable, V> = RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
6
+ export type RedBlackTreeNodeNested<K, V> = RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8
7
 
9
- export type RedBlackTreeNested<K extends Comparable, V, N extends RedBlackTreeNode<K, V, N>> = RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, RedBlackTree<K, V, N, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8
+ export type RedBlackTreeNested<K, V, R, NODE extends RedBlackTreeNode<K, V, NODE>> = RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
10
9
 
11
- export type RBTreeOptions<K> = BSTOptions<K> & {};
10
+ export type RBTreeOptions<K, V, R> = BSTOptions<K, V, R> & {};
@@ -1,9 +1,8 @@
1
1
  import { TreeMultiMap, TreeMultiMapNode } from '../../../data-structures';
2
2
  import type { RBTreeOptions } from './rb-tree';
3
- import { Comparable } from "../../utils";
4
3
 
5
- export type TreeMultiMapNodeNested<K extends Comparable, V> = TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
4
+ export type TreeMultiMapNodeNested<K, V> = TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
6
5
 
7
- export type TreeMultiMapNested<K extends Comparable, V, N extends TreeMultiMapNode<K, V, N>> = TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, TreeMultiMap<K, V, N, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
6
+ export type TreeMultiMapNested<K, V, R, NODE extends TreeMultiMapNode<K, V, NODE>> = TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
8
7
 
9
- export type TreeMultiMapOptions<K> = RBTreeOptions<K> & {}
8
+ export type TreeMultiMapOptions<K, V, R> = RBTreeOptions<K, V, R> & {}
@@ -1,3 +1,6 @@
1
1
  import { Comparator } from '../../common';
2
+ import { IterableElementBaseOptions } from '../base';
2
3
 
3
- export type HeapOptions<T> = { comparator?: Comparator<T> };
4
+ export type HeapOptions<E, R> = IterableElementBaseOptions<E, R> & {
5
+ comparator?: Comparator<E>;
6
+ };
@@ -1 +1,3 @@
1
- export {};
1
+ import { IterableElementBaseOptions } from '../base';
2
+
3
+ export type DoublyLinkedListOptions<E, R> = IterableElementBaseOptions<E, R> & {};
@@ -1 +1,3 @@
1
- export {};
1
+ import { IterableElementBaseOptions } from '../base';
2
+
3
+ export type SinglyLinkedListOptions<E, R> = IterableElementBaseOptions<E, R> & {};
@@ -1,3 +1,3 @@
1
1
  import { HeapOptions } from '../heap';
2
2
 
3
- export type PriorityQueueOptions<T> = HeapOptions<T> & {};
3
+ export type PriorityQueueOptions<E, R> = HeapOptions<E, R> & {};
@@ -1 +1,3 @@
1
- export type DequeOptions = { bucketSize?: number };
1
+ import { IterableElementBaseOptions } from '../base';
2
+
3
+ export type DequeOptions<E, R> = { bucketSize?: number } & IterableElementBaseOptions<E, R>;
@@ -1 +1,3 @@
1
- export {};
1
+ import { IterableElementBaseOptions } from '../base';
2
+
3
+ export type QueueOptions<E, R> = IterableElementBaseOptions<E, R> & {};
@@ -1 +1,3 @@
1
- export {};
1
+ import { IterableElementBaseOptions } from '../base';
2
+
3
+ export type StackOptions<E, R> = IterableElementBaseOptions<E, R> & {};
@@ -1 +1,3 @@
1
- export type TrieOptions = { caseSensitive?: boolean };
1
+ import { IterableElementBaseOptions } from '../base';
2
+
3
+ export type TrieOptions<R> = { caseSensitive?: boolean } & IterableElementBaseOptions<string, R>;
@@ -108,7 +108,7 @@ export const roundFixed = (num: number, digit: number = 10) => {
108
108
 
109
109
  export function isComparable(key: any): key is Comparable {
110
110
  const keyType = typeof key;
111
- if (keyType === 'number') return isNaN(key);
111
+ if (keyType === 'number') return !isNaN(key);
112
112
  if (keyType === 'string') return true;
113
113
  if (keyType === 'bigint') return true;
114
114
  if (keyType === 'boolean') return true;
@@ -117,8 +117,8 @@ export function isComparable(key: any): key is Comparable {
117
117
  if (keyType === 'function') return isComparable(key());
118
118
  if (keyType === 'object') {
119
119
  if (key === null) return true;
120
- if (typeof key.valueOf === 'function') return isComparable(key.valueOf());
121
- if (typeof key.toString === 'function') return isComparable(key.toString());
120
+ // if (typeof key.valueOf === 'function') return isComparable(key.valueOf()); // This will keep recursing because every object has a valueOf method.
121
+ // if (typeof key.toString === 'function') return isComparable(key.toString()); // This will also keep recursing because every string type has a toString method.
122
122
  return false;
123
123
  }
124
124
 
@@ -20,7 +20,7 @@ describe('AVL Tree Test', () => {
20
20
  [10, 10],
21
21
  [5, 5]
22
22
  ];
23
- const tree = new AVLTree();
23
+ const tree = new AVLTree<number, number>();
24
24
 
25
25
  for (const i of arr) tree.add(i);
26
26
 
@@ -44,7 +44,7 @@ describe('AVL Tree Test', () => {
44
44
  expect(subTreeSum).toBe(70);
45
45
 
46
46
  let lesserSum = 0;
47
- tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
47
+ tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
48
48
  expect(lesserSum).toBe(45);
49
49
 
50
50
  // node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
@@ -2,7 +2,7 @@ import { BST, BSTNode } from 'bst-typed';
2
2
 
3
3
  describe('Individual package BST operations test', () => {
4
4
  it('should perform various operations on a Binary Search Tree with numeric values', () => {
5
- const bst = new BST();
5
+ const bst = new BST<number>();
6
6
  expect(bst).toBeInstanceOf(BST);
7
7
  bst.add([11, 11]);
8
8
  bst.add([3, 3]);
@@ -38,7 +38,7 @@ describe('Individual package BST operations test', () => {
38
38
  expect(subTreeSum).toBe(70);
39
39
 
40
40
  let lesserSum = 0;
41
- bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
41
+ bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
42
42
  expect(lesserSum).toBe(45);
43
43
 
44
44
  expect(node15).toBeInstanceOf(BSTNode);
@@ -235,7 +235,7 @@ describe('Individual package BST operations test', () => {
235
235
  expect(subTreeSum).toBe(70);
236
236
 
237
237
  let lesserSum = 0;
238
- objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), 'LT', 10);
238
+ objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
239
239
  expect(lesserSum).toBe(45);
240
240
 
241
241
  expect(node15).toBeInstanceOf(BSTNode);
@@ -11,6 +11,20 @@
11
11
  <!-- <script src='https://cdn.jsdelivr.net/npm/data-structure-typed@1.44.0/dist/umd/data-structure-typed.min.js'></script>-->
12
12
 
13
13
  <script src='https://unpkg.com/js-sdsl@4.4.2/dist/umd/js-sdsl.js'></script>
14
+ <script>
15
+ const logPerf = function (label = 'function running cost', fn, args, thisArg) {
16
+ const start = performance.now();
17
+ let result;
18
+ if (thisArg) {
19
+ if (args && args.length > 0) result = fn.apply(thisArg, args);
20
+ else result = fn.apply(thisArg);
21
+ } else {
22
+ if (args && args.length > 0) result = fn(...args);
23
+ else result = fn();
24
+ }
25
+ console.log(`${(performance.now() - start).toFixed(2)} ms, ${label}, ${result}`);
26
+ }
27
+ </script>
14
28
  </head>
15
29
  <body>
16
30
  <div id='app'>
@@ -26,19 +40,19 @@
26
40
  const { Queue } = dataStructureTyped;
27
41
  const queue = new Queue();
28
42
  const n = 1000000;
29
- const startEn = performance.now();
30
- for (let i = 0; i < n; i++) {
31
- queue.push(i);
32
- }
33
- console.log((performance.now() - startEn).toFixed(2), `Queue ${n.toLocaleString()} enqueue `);
34
- let last = 0;
35
- const startTime = performance.now();
43
+ logPerf(`Queue ${n.toLocaleString()} enqueue`, () => {
44
+ for (let i = 0; i < n; i++) {
45
+ queue.push(i);
46
+ }
47
+ })
36
48
 
37
- for (let i = 0; i < n; i++) {
38
- last = queue.shift();
39
- }
49
+ let last = 0;
40
50
 
41
- console.log((performance.now() - startTime).toFixed(2), `Queue ${n.toLocaleString()} dequeue `);
51
+ logPerf(`Queue ${n.toLocaleString()} dequeue `, () => {
52
+ for (let i = 0; i < n; i++) {
53
+ last = queue.shift();
54
+ }
55
+ })
42
56
 
43
57
  } catch (e) {
44
58
  console.error(e);
@@ -689,3 +689,71 @@ describe('AVLTreeMultiMap iterative methods test', () => {
689
689
  expect([...values]).toEqual(['a', 'b', 'c']);
690
690
  });
691
691
  });
692
+
693
+ describe('AVLTree toEntryFn', () => {
694
+ it('should toEntryFn 1', () => {
695
+ const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>([], {
696
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
697
+ });
698
+ tree.add({ obj: { id: 1 } });
699
+ tree.add({ obj: { id: 2 } });
700
+ tree.add({ obj: { id: 3 } });
701
+ tree.add({ obj: { id: 4 } });
702
+ tree.add({ obj: { id: 5 } });
703
+
704
+ const expected = [1, 2, 3, 4, 5];
705
+
706
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
707
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
708
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
709
+ });
710
+
711
+ it('should toEntryFn 2', () => {
712
+ const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>(
713
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
714
+ {
715
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
716
+ }
717
+ );
718
+
719
+ const expected = [1, 2, 3, 4, 5];
720
+
721
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
722
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
723
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
724
+ });
725
+
726
+ it('should toEntryFn throw error', () => {
727
+ expect(
728
+ () =>
729
+ new AVLTreeMultiMap<{ obj: { id: number } }, number>([
730
+ { obj: { id: 1 } },
731
+ { obj: { id: 2 } },
732
+ { obj: { id: 3 } },
733
+ { obj: { id: 4 } },
734
+ { obj: { id: 5 } }
735
+ ])
736
+ ).toThrowError(
737
+ `When comparing object types, a custom comparator must be defined in the constructor's options parameter.`
738
+ );
739
+ });
740
+
741
+ it('should toEntryFn 3', () => {
742
+ const tree = new AVLTreeMultiMap<{ obj: { id: number } }, number>(
743
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
744
+ { comparator: (a, b) => a.obj.id - b.obj.id }
745
+ );
746
+
747
+ const expected = [
748
+ { obj: { id: 1 } },
749
+ { obj: { id: 2 } },
750
+ { obj: { id: 3 } },
751
+ { obj: { id: 4 } },
752
+ { obj: { id: 5 } }
753
+ ];
754
+
755
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
756
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
757
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
758
+ });
759
+ });
@@ -403,6 +403,62 @@ describe('BinaryTree Morris Traversal', () => {
403
403
  });
404
404
  });
405
405
 
406
+ describe('BinaryTree toEntryFn', () => {
407
+ it('should toEntryFn 1', () => {
408
+ const tree = new BinaryTree<number, number, { obj: { id: number } }>([], {
409
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
410
+ });
411
+ tree.add({ obj: { id: 1 } });
412
+ tree.add({ obj: { id: 2 } });
413
+ tree.add({ obj: { id: 3 } });
414
+ tree.add({ obj: { id: 4 } });
415
+ tree.add({ obj: { id: 5 } });
416
+
417
+ const expected = [4, 2, 5, 1, 3];
418
+
419
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
420
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
421
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
422
+ });
423
+
424
+ it('should toEntryFn 2', () => {
425
+ const tree = new BinaryTree<number, number, { obj: { id: number } }>(
426
+ [{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
427
+ {
428
+ toEntryFn: ele => [ele.obj.id, ele.obj.id]
429
+ }
430
+ );
431
+
432
+ const expected = [4, 2, 5, 1, 3];
433
+
434
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
435
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
436
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
437
+ });
438
+
439
+ it('should toEntryFn 3', () => {
440
+ const tree = new BinaryTree<{ obj: { id: number } }, number>([
441
+ { obj: { id: 1 } },
442
+ { obj: { id: 2 } },
443
+ { obj: { id: 3 } },
444
+ { obj: { id: 4 } },
445
+ { obj: { id: 5 } }
446
+ ]);
447
+
448
+ const expected = [
449
+ { obj: { id: 4 } },
450
+ { obj: { id: 2 } },
451
+ { obj: { id: 5 } },
452
+ { obj: { id: 1 } },
453
+ { obj: { id: 3 } }
454
+ ];
455
+
456
+ expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
457
+ expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
458
+ expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
459
+ });
460
+ });
461
+
406
462
  describe('BinaryTree traversals', () => {
407
463
  const tree = new BinaryTree<number>();
408
464
 
@@ -132,11 +132,11 @@ class MyDirectedGraph<
132
132
  VO extends MyVertex<V> = MyVertex<V>,
133
133
  EO extends MyEdge<E> = MyEdge<E>
134
134
  > extends DirectedGraph<V, E, VO, EO> {
135
- createVertex(key: VertexKey, value: V): VO {
135
+ override createVertex(key: VertexKey, value: V): VO {
136
136
  return new MyVertex(key, value) as VO;
137
137
  }
138
138
 
139
- createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
139
+ override createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
140
140
  return new MyEdge(src, dest, weight ?? 1, value) as EO;
141
141
  }
142
142
 
@@ -87,6 +87,86 @@ describe('Heap Operation Test', () => {
87
87
  maxI++;
88
88
  }
89
89
  });
90
+
91
+ it('should object heap map & filter', function () {
92
+ const minHeap = new MinHeap<{ a: string; key: number }>(
93
+ [
94
+ { key: 1, a: 'a1' },
95
+ { key: 6, a: 'a6' },
96
+ { key: 5, a: 'a5' },
97
+ { key: 3, a: 'a3' },
98
+ { key: 2, a: 'a2' },
99
+ { key: 4, a: 'a4' },
100
+ { key: 0, a: 'a0' }
101
+ ],
102
+ { comparator: (a, b) => a.key - b.key }
103
+ );
104
+
105
+ const mappedMinHeap = minHeap.map(
106
+ item => item.key,
107
+ (a, b) => a - b
108
+ );
109
+ expect(mappedMinHeap.peek()).toBe(0);
110
+ expect(mappedMinHeap.sort()).toEqual([0, 1, 2, 3, 4, 5, 6]);
111
+
112
+ const mappedToElementFnMinHeap = minHeap.map<string, { id: string }>(
113
+ item => item.key.toString(),
114
+ (a, b) => Number(a) - Number(b),
115
+ rawElement => rawElement.id
116
+ );
117
+ expect(mappedToElementFnMinHeap.peek()).toBe('0');
118
+ expect(mappedToElementFnMinHeap.sort()).toEqual(['0', '1', '2', '3', '4', '5', '6']);
119
+
120
+ const filteredHeap = minHeap.filter(item => item.key > 3);
121
+ expect(filteredHeap.peek()).toEqual({ a: 'a4', key: 4 });
122
+ expect(filteredHeap.sort()).toEqual([
123
+ { a: 'a4', key: 4 },
124
+ { a: 'a5', key: 5 },
125
+ { a: 'a6', key: 6 }
126
+ ]);
127
+ });
128
+
129
+ it('should object heap', () => {
130
+ const heap = new Heap<{ rawItem: { id: number } }>(
131
+ [
132
+ { rawItem: { id: 4 } },
133
+ { rawItem: { id: 8 } },
134
+ { rawItem: { id: 6 } },
135
+ { rawItem: { id: 7 } },
136
+ { rawItem: { id: 1 } },
137
+ { rawItem: { id: 3 } },
138
+ { rawItem: { id: 5 } }
139
+ ],
140
+ { comparator: (a, b) => a.rawItem.id - b.rawItem.id }
141
+ );
142
+
143
+ expect([...heap.sort()]).toEqual([
144
+ { rawItem: { id: 1 } },
145
+ { rawItem: { id: 3 } },
146
+ { rawItem: { id: 4 } },
147
+ { rawItem: { id: 5 } },
148
+ { rawItem: { id: 6 } },
149
+ { rawItem: { id: 7 } },
150
+ { rawItem: { id: 8 } }
151
+ ]);
152
+ });
153
+
154
+ it('should toElementFn', () => {
155
+ const heap = new Heap<number, { rawItem: { id: number } }>(
156
+ [
157
+ { rawItem: { id: 4 } },
158
+ { rawItem: { id: 8 } },
159
+ { rawItem: { id: 6 } },
160
+ { rawItem: { id: 7 } },
161
+ { rawItem: { id: 1 } },
162
+ { rawItem: { id: 3 } },
163
+ { rawItem: { id: 5 } }
164
+ ],
165
+ { toElementFn: rawElement => rawElement.rawItem.id }
166
+ );
167
+
168
+ expect([...heap.sort()]).toEqual([1, 3, 4, 5, 6, 7, 8]);
169
+ });
90
170
  });
91
171
 
92
172
  describe('FibonacciHeap', () => {
@@ -5,7 +5,7 @@ describe('MaxHeap', () => {
5
5
  let maxHeap: MaxHeap<number>;
6
6
 
7
7
  beforeEach(() => {
8
- maxHeap = new MaxHeap([], { comparator: numberComparator });
8
+ maxHeap = new MaxHeap<number>([], { comparator: numberComparator });
9
9
  });
10
10
 
11
11
  it('add and poll elements in descending order', () => {
@@ -49,4 +49,47 @@ describe('MaxHeap', () => {
49
49
  maxHeap.poll();
50
50
  expect(maxHeap.isEmpty()).toBe(true);
51
51
  });
52
+
53
+ it('should object heap map & filter', function () {
54
+ const maxHeap = new MaxHeap<{ a: string; key: number }>(
55
+ [
56
+ { key: 1, a: 'a1' },
57
+ { key: 6, a: 'a6' },
58
+ { key: 5, a: 'a5' },
59
+ { key: 3, a: 'a3' },
60
+ { key: 2, a: 'a2' },
61
+ { key: 4, a: 'a4' },
62
+ { key: 0, a: 'a0' }
63
+ ],
64
+ { comparator: (a, b) => b.key - a.key }
65
+ );
66
+
67
+ const mappedMaxHeap = maxHeap.map(
68
+ item => item.key,
69
+ (a, b) => b - a
70
+ );
71
+ expect(mappedMaxHeap.peek()).toBe(6);
72
+ expect(mappedMaxHeap.sort()).toEqual([6, 5, 4, 3, 2, 1, 0]);
73
+
74
+ const mappedToElementFnMaxHeap = maxHeap.map<
75
+ string,
76
+ {
77
+ id: string;
78
+ }
79
+ >(
80
+ item => item.key.toString(),
81
+ (a, b) => Number(b) - Number(a),
82
+ rawElement => rawElement.id
83
+ );
84
+ expect(mappedToElementFnMaxHeap.peek()).toBe('6');
85
+ expect(mappedToElementFnMaxHeap.sort()).toEqual(['6', '5', '4', '3', '2', '1', '0']);
86
+
87
+ const filteredHeap = maxHeap.filter(item => item.key > 3);
88
+ expect(filteredHeap.peek()).toEqual({ a: 'a6', key: 6 });
89
+ expect(filteredHeap.sort()).toEqual([
90
+ { a: 'a6', key: 6 },
91
+ { a: 'a5', key: 5 },
92
+ { a: 'a4', key: 4 }
93
+ ]);
94
+ });
52
95
  });
@@ -5,7 +5,7 @@ describe('MinHeap', () => {
5
5
  let minHeap: MinHeap<number>;
6
6
 
7
7
  beforeEach(() => {
8
- minHeap = new MinHeap([], { comparator: numberComparator });
8
+ minHeap = new MinHeap<number>([], { comparator: numberComparator });
9
9
  });
10
10
 
11
11
  it('add and poll elements in ascending order', () => {
@@ -40,6 +40,23 @@ describe('MinHeap', () => {
40
40
  expect(sortedArray).toEqual([1, 2, 3, 4]);
41
41
  });
42
42
 
43
+ it('should clone', function () {
44
+ const minHeap = new MinHeap<string>();
45
+ minHeap.add('1');
46
+ minHeap.add('6');
47
+ minHeap.add('2');
48
+ minHeap.add('0');
49
+ minHeap.add('5');
50
+ minHeap.add('9');
51
+ minHeap.delete('2');
52
+ expect([...minHeap]).toEqual(['0', '1', '9', '6', '5']);
53
+ const cloned = minHeap.clone();
54
+ expect([...cloned]).toEqual(['0', '1', '9', '6', '5']);
55
+ minHeap.delete('5');
56
+ expect([...minHeap]).toEqual(['0', '1', '9', '6']);
57
+ expect([...cloned]).toEqual(['0', '1', '9', '6', '5']);
58
+ });
59
+
43
60
  it('check if the heap is empty', () => {
44
61
  expect(minHeap.isEmpty()).toBe(true);
45
62
 
@@ -71,4 +71,46 @@ describe('MaxPriorityQueue Operation Test', () => {
71
71
  expect(maxPQ.poll()?.keyA).toBe(3);
72
72
  expect(maxPQ.poll()?.keyA).toBe(1);
73
73
  });
74
+
75
+ it('should object priority queue', () => {
76
+ const maxPQ = new MaxPriorityQueue<{ rawItem: { id: number } }>(
77
+ [
78
+ { rawItem: { id: 4 } },
79
+ { rawItem: { id: 8 } },
80
+ { rawItem: { id: 6 } },
81
+ { rawItem: { id: 7 } },
82
+ { rawItem: { id: 1 } },
83
+ { rawItem: { id: 3 } },
84
+ { rawItem: { id: 5 } }
85
+ ],
86
+ { comparator: (a, b) => b.rawItem.id - a.rawItem.id }
87
+ );
88
+
89
+ expect([...maxPQ.sort()]).toEqual([
90
+ { rawItem: { id: 8 } },
91
+ { rawItem: { id: 7 } },
92
+ { rawItem: { id: 6 } },
93
+ { rawItem: { id: 5 } },
94
+ { rawItem: { id: 4 } },
95
+ { rawItem: { id: 3 } },
96
+ { rawItem: { id: 1 } }
97
+ ]);
98
+ });
99
+
100
+ it('should toElementFn', () => {
101
+ const maxPQ = new MaxPriorityQueue<number, { rawItem: { id: number } }>(
102
+ [
103
+ { rawItem: { id: 4 } },
104
+ { rawItem: { id: 8 } },
105
+ { rawItem: { id: 6 } },
106
+ { rawItem: { id: 7 } },
107
+ { rawItem: { id: 1 } },
108
+ { rawItem: { id: 3 } },
109
+ { rawItem: { id: 5 } }
110
+ ],
111
+ { toElementFn: rawElement => rawElement.rawItem.id }
112
+ );
113
+
114
+ expect([...maxPQ.sort()]).toEqual([8, 7, 6, 5, 4, 3, 1]);
115
+ });
74
116
  });