data-structure-typed 1.54.3 → 2.0.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 (208) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/benchmark/report.html +26 -2
  3. package/benchmark/report.json +292 -42
  4. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +14 -40
  5. package/dist/cjs/data-structures/base/iterable-element-base.js +14 -11
  6. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
  7. package/dist/cjs/data-structures/base/linear-base.d.ts +277 -0
  8. package/dist/cjs/data-structures/base/linear-base.js +553 -0
  9. package/dist/cjs/data-structures/base/linear-base.js.map +1 -0
  10. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -8
  11. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +50 -37
  12. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  13. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +64 -0
  14. package/dist/cjs/data-structures/binary-tree/avl-tree.js +64 -0
  15. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  16. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +62 -0
  17. package/dist/cjs/data-structures/binary-tree/binary-tree.js +67 -5
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  19. package/dist/cjs/data-structures/binary-tree/bst.d.ts +3 -3
  20. package/dist/cjs/data-structures/binary-tree/bst.js +14 -14
  21. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  22. package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +1 -7
  23. package/dist/cjs/data-structures/binary-tree/red-black-tree.js +1 -7
  24. package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
  25. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +175 -14
  26. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +210 -40
  27. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  28. package/dist/cjs/data-structures/graph/abstract-graph.js +16 -16
  29. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  30. package/dist/cjs/data-structures/hash/hash-map.d.ts +46 -0
  31. package/dist/cjs/data-structures/hash/hash-map.js +46 -0
  32. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  33. package/dist/cjs/data-structures/heap/heap.d.ts +3 -11
  34. package/dist/cjs/data-structures/heap/heap.js +0 -10
  35. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  36. package/dist/cjs/data-structures/heap/max-heap.d.ts +2 -2
  37. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  38. package/dist/cjs/data-structures/heap/min-heap.d.ts +2 -2
  39. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  40. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
  41. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +131 -146
  42. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  43. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +145 -75
  44. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +283 -169
  45. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  46. package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  47. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  48. package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  49. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  50. package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +2 -2
  51. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  52. package/dist/cjs/data-structures/queue/deque.d.ts +130 -91
  53. package/dist/cjs/data-structures/queue/deque.js +269 -169
  54. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  55. package/dist/cjs/data-structures/queue/queue.d.ts +131 -40
  56. package/dist/cjs/data-structures/queue/queue.js +181 -50
  57. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  58. package/dist/cjs/data-structures/stack/stack.d.ts +124 -11
  59. package/dist/cjs/data-structures/stack/stack.js +121 -10
  60. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  61. package/dist/cjs/data-structures/trie/trie.d.ts +4 -3
  62. package/dist/cjs/data-structures/trie/trie.js +3 -0
  63. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  64. package/dist/cjs/types/data-structures/base/base.d.ts +9 -4
  65. package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
  66. package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
  67. package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  68. package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  69. package/dist/cjs/types/data-structures/queue/deque.d.ts +2 -3
  70. package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -2
  71. package/dist/esm/data-structures/base/iterable-element-base.d.ts +14 -40
  72. package/dist/esm/data-structures/base/iterable-element-base.js +14 -11
  73. package/dist/esm/data-structures/base/iterable-element-base.js.map +1 -1
  74. package/dist/esm/data-structures/base/linear-base.d.ts +277 -0
  75. package/dist/esm/data-structures/base/linear-base.js +549 -0
  76. package/dist/esm/data-structures/base/linear-base.js.map +1 -0
  77. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -8
  78. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +50 -36
  79. package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  80. package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +64 -0
  81. package/dist/esm/data-structures/binary-tree/avl-tree.js +64 -0
  82. package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
  83. package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +62 -0
  84. package/dist/esm/data-structures/binary-tree/binary-tree.js +67 -5
  85. package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
  86. package/dist/esm/data-structures/binary-tree/bst.d.ts +3 -3
  87. package/dist/esm/data-structures/binary-tree/bst.js +14 -12
  88. package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
  89. package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +1 -7
  90. package/dist/esm/data-structures/binary-tree/red-black-tree.js +1 -7
  91. package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
  92. package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +175 -14
  93. package/dist/esm/data-structures/binary-tree/tree-multi-map.js +210 -39
  94. package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  95. package/dist/esm/data-structures/graph/abstract-graph.js +16 -16
  96. package/dist/esm/data-structures/graph/abstract-graph.js.map +1 -1
  97. package/dist/esm/data-structures/hash/hash-map.d.ts +46 -0
  98. package/dist/esm/data-structures/hash/hash-map.js +46 -0
  99. package/dist/esm/data-structures/hash/hash-map.js.map +1 -1
  100. package/dist/esm/data-structures/heap/heap.d.ts +3 -11
  101. package/dist/esm/data-structures/heap/heap.js +0 -10
  102. package/dist/esm/data-structures/heap/heap.js.map +1 -1
  103. package/dist/esm/data-structures/heap/max-heap.d.ts +2 -2
  104. package/dist/esm/data-structures/heap/max-heap.js.map +1 -1
  105. package/dist/esm/data-structures/heap/min-heap.d.ts +2 -2
  106. package/dist/esm/data-structures/heap/min-heap.js.map +1 -1
  107. package/dist/esm/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
  108. package/dist/esm/data-structures/linked-list/doubly-linked-list.js +132 -148
  109. package/dist/esm/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  110. package/dist/esm/data-structures/linked-list/singly-linked-list.d.ts +145 -75
  111. package/dist/esm/data-structures/linked-list/singly-linked-list.js +283 -170
  112. package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -1
  113. package/dist/esm/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
  114. package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  115. package/dist/esm/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
  116. package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  117. package/dist/esm/data-structures/priority-queue/priority-queue.d.ts +2 -2
  118. package/dist/esm/data-structures/priority-queue/priority-queue.js.map +1 -1
  119. package/dist/esm/data-structures/queue/deque.d.ts +130 -91
  120. package/dist/esm/data-structures/queue/deque.js +269 -169
  121. package/dist/esm/data-structures/queue/deque.js.map +1 -1
  122. package/dist/esm/data-structures/queue/queue.d.ts +131 -40
  123. package/dist/esm/data-structures/queue/queue.js +182 -51
  124. package/dist/esm/data-structures/queue/queue.js.map +1 -1
  125. package/dist/esm/data-structures/stack/stack.d.ts +124 -11
  126. package/dist/esm/data-structures/stack/stack.js +121 -10
  127. package/dist/esm/data-structures/stack/stack.js.map +1 -1
  128. package/dist/esm/data-structures/trie/trie.d.ts +4 -3
  129. package/dist/esm/data-structures/trie/trie.js +3 -0
  130. package/dist/esm/data-structures/trie/trie.js.map +1 -1
  131. package/dist/esm/types/data-structures/base/base.d.ts +9 -4
  132. package/dist/esm/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
  133. package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
  134. package/dist/esm/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
  135. package/dist/esm/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
  136. package/dist/esm/types/data-structures/queue/deque.d.ts +2 -3
  137. package/dist/esm/types/data-structures/queue/queue.d.ts +2 -2
  138. package/dist/individuals/binary-tree/avl-tree-counter.mjs +4701 -0
  139. package/dist/individuals/binary-tree/avl-tree-multi-map.mjs +4514 -0
  140. package/dist/individuals/binary-tree/avl-tree.mjs +4321 -0
  141. package/dist/individuals/binary-tree/binary-tree.mjs +3097 -0
  142. package/dist/individuals/binary-tree/bst.mjs +3858 -0
  143. package/dist/individuals/binary-tree/red-black-tree.mjs +4391 -0
  144. package/dist/individuals/binary-tree/tree-counter.mjs +4806 -0
  145. package/dist/individuals/binary-tree/tree-multi-map.mjs +4582 -0
  146. package/dist/individuals/graph/directed-graph.mjs +2910 -0
  147. package/dist/individuals/graph/undirected-graph.mjs +2745 -0
  148. package/dist/individuals/hash/hash-map.mjs +1040 -0
  149. package/dist/individuals/heap/heap.mjs +909 -0
  150. package/dist/individuals/heap/max-heap.mjs +671 -0
  151. package/dist/individuals/heap/min-heap.mjs +659 -0
  152. package/dist/individuals/linked-list/doubly-linked-list.mjs +1495 -0
  153. package/dist/individuals/linked-list/singly-linked-list.mjs +1479 -0
  154. package/dist/individuals/priority-queue/max-priority-queue.mjs +768 -0
  155. package/dist/individuals/priority-queue/min-priority-queue.mjs +757 -0
  156. package/dist/individuals/priority-queue/priority-queue.mjs +670 -0
  157. package/dist/individuals/queue/deque.mjs +1262 -0
  158. package/dist/individuals/queue/queue.mjs +1865 -0
  159. package/dist/individuals/stack/stack.mjs +415 -0
  160. package/dist/individuals/trie/trie.mjs +687 -0
  161. package/dist/umd/data-structure-typed.js +1260 -649
  162. package/dist/umd/data-structure-typed.min.js +3 -3
  163. package/dist/umd/data-structure-typed.min.js.map +1 -1
  164. package/package.json +7 -7
  165. package/src/data-structures/base/iterable-element-base.ts +29 -20
  166. package/src/data-structures/base/linear-base.ts +649 -0
  167. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +51 -36
  168. package/src/data-structures/binary-tree/avl-tree.ts +64 -0
  169. package/src/data-structures/binary-tree/binary-tree.ts +5 -5
  170. package/src/data-structures/binary-tree/bst.ts +9 -9
  171. package/src/data-structures/binary-tree/tree-multi-map.ts +214 -40
  172. package/src/data-structures/graph/abstract-graph.ts +16 -16
  173. package/src/data-structures/hash/hash-map.ts +46 -0
  174. package/src/data-structures/heap/heap.ts +3 -14
  175. package/src/data-structures/heap/max-heap.ts +2 -2
  176. package/src/data-structures/heap/min-heap.ts +2 -2
  177. package/src/data-structures/linked-list/doubly-linked-list.ts +144 -160
  178. package/src/data-structures/linked-list/singly-linked-list.ts +307 -185
  179. package/src/data-structures/priority-queue/max-priority-queue.ts +2 -5
  180. package/src/data-structures/priority-queue/min-priority-queue.ts +2 -5
  181. package/src/data-structures/priority-queue/priority-queue.ts +2 -2
  182. package/src/data-structures/queue/deque.ts +286 -183
  183. package/src/data-structures/queue/queue.ts +196 -63
  184. package/src/data-structures/stack/stack.ts +124 -18
  185. package/src/data-structures/trie/trie.ts +7 -3
  186. package/src/types/data-structures/base/base.ts +17 -8
  187. package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
  188. package/src/types/data-structures/binary-tree/tree-multi-map.ts +1 -1
  189. package/src/types/data-structures/linked-list/doubly-linked-list.ts +2 -2
  190. package/src/types/data-structures/linked-list/singly-linked-list.ts +2 -2
  191. package/src/types/data-structures/queue/deque.ts +2 -3
  192. package/src/types/data-structures/queue/queue.ts +2 -2
  193. package/test/integration/all-in-one.test.ts +1 -1
  194. package/test/integration/avl-tree.test.ts +1 -1
  195. package/test/integration/bst.test.ts +2 -2
  196. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +168 -0
  197. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +15 -14
  198. package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +1 -1
  199. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +165 -7
  200. package/test/unit/data-structures/graph/directed-graph.test.ts +37 -37
  201. package/test/unit/data-structures/graph/undirected-graph.test.ts +2 -2
  202. package/test/unit/data-structures/hash/hash-map.test.ts +135 -0
  203. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +135 -27
  204. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +183 -12
  205. package/test/unit/data-structures/queue/deque.test.ts +241 -60
  206. package/test/unit/data-structures/queue/queue.test.ts +332 -19
  207. package/test/unit/data-structures/stack/stack.test.ts +165 -0
  208. package/test/unit/unrestricted-interconversion.test.ts +1 -1
@@ -11,13 +11,13 @@ describe('Deque - Basic Operations', () => {
11
11
  });
12
12
 
13
13
  it('push should add elements to the end', () => {
14
- expect(deque.size).toBe(2);
14
+ expect(deque.length).toBe(2);
15
15
  expect(deque.last).toBe(2);
16
16
  });
17
17
 
18
18
  it('pop should remove elements from the end', () => {
19
19
  expect(deque.pop()).toBe(2);
20
- expect(deque.size).toBe(1);
20
+ expect(deque.length).toBe(1);
21
21
  expect(deque.pop()).toBe(1);
22
22
  expect(deque.isEmpty()).toBeTruthy();
23
23
  });
@@ -26,7 +26,7 @@ describe('Deque - Basic Operations', () => {
26
26
  deque.clear();
27
27
  deque.unshift(1);
28
28
  deque.unshift(2);
29
- expect(deque.size).toBe(2);
29
+ expect(deque.length).toBe(2);
30
30
  expect(deque.first).toBe(2);
31
31
  });
32
32
 
@@ -35,7 +35,7 @@ describe('Deque - Basic Operations', () => {
35
35
  deque.unshift(1);
36
36
  deque.unshift(2);
37
37
  expect(deque.shift()).toBe(2);
38
- expect(deque.size).toBe(1);
38
+ expect(deque.length).toBe(1);
39
39
  expect(deque.shift()).toBe(1);
40
40
  expect(deque.isEmpty()).toBeTruthy();
41
41
  });
@@ -88,24 +88,24 @@ describe('Deque - Basic Operations', () => {
88
88
  deque.push('0');
89
89
  deque.push('5');
90
90
  deque.push('9');
91
- expect(deque.size).toBe(6);
91
+ expect(deque.length).toBe(6);
92
92
  deque.delete('2');
93
- expect(deque.size).toBe(5);
93
+ expect(deque.length).toBe(5);
94
94
  expect([...deque]).toEqual(['1', '6', '0', '5', '9']);
95
95
  const cloned = deque.clone();
96
96
  expect([...cloned]).toEqual(['1', '6', '0', '5', '9']);
97
- expect(deque.size).toBe(5);
97
+ expect(deque.length).toBe(5);
98
98
  deque.delete('5');
99
- expect(deque.size).toBe(4);
99
+ expect(deque.length).toBe(4);
100
100
  expect([...deque]).toEqual(['1', '6', '0', '9']);
101
101
  expect([...cloned]).toEqual(['1', '6', '0', '5', '9']);
102
- expect(cloned.size).toBe(5);
102
+ expect(cloned.length).toBe(5);
103
103
  cloned.push('8');
104
- expect(cloned.size).toBe(6);
104
+ expect(cloned.length).toBe(6);
105
105
  cloned.delete('6');
106
- expect(cloned.size).toBe(5);
106
+ expect(cloned.length).toBe(5);
107
107
  cloned.delete('6');
108
- expect(cloned.size).toBe(5);
108
+ expect(cloned.length).toBe(5);
109
109
  });
110
110
  });
111
111
  describe('Deque - Complex Operations', () => {
@@ -126,15 +126,15 @@ describe('Deque - Complex Operations', () => {
126
126
  deque.push(1);
127
127
  deque.push(2);
128
128
  deque.push(3);
129
- expect(deque.size).toBe(3);
129
+ expect(deque.length).toBe(3);
130
130
  deque.cut(1, true);
131
- expect(deque.size).toBe(2);
131
+ expect(deque.length).toBe(2);
132
132
  expect(deque.toArray()).toEqual([1, 2]);
133
133
 
134
134
  const dq1 = new Deque([1, 2, 3, 4, 5, 6, 7]);
135
- expect(dq1.size).toBe(7);
135
+ expect(dq1.length).toBe(7);
136
136
  expect([...dq1.cut(3, true)]).toEqual([1, 2, 3, 4]);
137
- expect(dq1.size).toBe(4);
137
+ expect(dq1.length).toBe(4);
138
138
  expect([...dq1]).toEqual([1, 2, 3, 4]);
139
139
  const dqCut = dq1.cut(2);
140
140
  expect(dqCut.toArray()).toEqual([1, 2, 3]);
@@ -228,7 +228,7 @@ describe('Deque - Complex Operations', () => {
228
228
 
229
229
  it('shrinkToFit should reduce the memory footprint', () => {
230
230
  deque.shrinkToFit();
231
- expect(deque.size).toBe(0);
231
+ expect(deque.length).toBe(0);
232
232
  expect(deque.has(1)).toBe(false);
233
233
  expect(deque.bucketFirst).toBe(0);
234
234
  expect(deque.bucketLast).toBe(0);
@@ -241,7 +241,7 @@ describe('Deque - Complex Operations', () => {
241
241
  deque.shrinkToFit();
242
242
 
243
243
  deque = new Deque([1, 2, 3, 4, 5], { bucketSize: 2 });
244
- expect(deque.size).toBe(5);
244
+ expect(deque.length).toBe(5);
245
245
  expect(deque.has(1)).toBe(true);
246
246
  expect(deque.bucketFirst).toBe(0);
247
247
  expect(deque.bucketLast).toBe(2);
@@ -322,19 +322,19 @@ describe('Deque - Utility Operations', () => {
322
322
 
323
323
  it('should maxLen work well', () => {
324
324
  const dequeMaxLen = new Deque([3, 4, 5, 6, 7], { maxLen: 3 });
325
- expect(dequeMaxLen.size).toBe(3);
325
+ expect(dequeMaxLen.length).toBe(3);
326
326
  expect(dequeMaxLen.toArray()).toEqual([5, 6, 7]);
327
327
  dequeMaxLen.unshift(4);
328
328
  dequeMaxLen.unshift(3);
329
- expect(dequeMaxLen.size).toBe(3);
329
+ expect(dequeMaxLen.length).toBe(3);
330
330
  expect(dequeMaxLen.toArray()).toEqual([3, 4, 5]);
331
331
 
332
332
  const dequeNoMaxLen = new Deque([3, 4, 5, 6, 7]);
333
- expect(dequeNoMaxLen.size).toBe(5);
333
+ expect(dequeNoMaxLen.length).toBe(5);
334
334
  expect(dequeNoMaxLen.toArray()).toEqual([3, 4, 5, 6, 7]);
335
335
  dequeNoMaxLen.unshift(4);
336
336
  dequeNoMaxLen.unshift(3);
337
- expect(dequeNoMaxLen.size).toBe(7);
337
+ expect(dequeNoMaxLen.length).toBe(7);
338
338
  expect(dequeNoMaxLen.toArray()).toEqual([3, 4, 3, 4, 5, 6, 7]);
339
339
  });
340
340
  });
@@ -350,21 +350,21 @@ describe('Deque - Additional Operations', () => {
350
350
  deque.push(1);
351
351
  deque.push(2);
352
352
  expect(deque.last).toBe(2);
353
- expect(deque.size).toBe(2);
353
+ expect(deque.length).toBe(2);
354
354
  });
355
355
 
356
356
  it('pop should remove and return the last element', () => {
357
357
  deque.push(1);
358
358
  deque.push(2);
359
359
  expect(deque.pop()).toBe(2);
360
- expect(deque.size).toBe(1);
360
+ expect(deque.length).toBe(1);
361
361
  });
362
362
 
363
363
  it('unshift should add an element to the beginning', () => {
364
364
  deque.unshift(1);
365
365
  deque.unshift(2);
366
366
  expect(deque.first).toBe(2);
367
- expect(deque.size).toBe(2);
367
+ expect(deque.length).toBe(2);
368
368
  });
369
369
 
370
370
  it('shift should remove and return the first element', () => {
@@ -372,31 +372,31 @@ describe('Deque - Additional Operations', () => {
372
372
  deque.unshift(1);
373
373
  deque.unshift(2);
374
374
  expect(deque.shift()).toBe(2);
375
- expect(deque.size).toBe(1);
375
+ expect(deque.length).toBe(1);
376
376
  });
377
377
 
378
378
  it('clear should reset the deque', () => {
379
379
  deque.unshift(1);
380
380
  deque.clear();
381
- expect(deque.size).toBe(0);
381
+ expect(deque.length).toBe(0);
382
382
  expect(deque.isEmpty()).toBeTruthy();
383
383
  });
384
384
 
385
- it('begin should yield elements from the beginning', () => {
386
- deque.push(1);
387
- deque.push(2);
388
- const iterator = deque.begin();
389
- expect(iterator.next().value).toBe(1);
390
- expect(iterator.next().value).toBe(2);
391
- });
392
-
393
- it('reverseBegin should yield elements in reverse order', () => {
394
- deque.push(1);
395
- deque.push(2);
396
- const iterator = deque.reverseBegin();
397
- expect(iterator.next().value).toBe(2);
398
- expect(iterator.next().value).toBe(1);
399
- });
385
+ // it('begin should yield elements from the beginning', () => {
386
+ // deque.push(1);
387
+ // deque.push(2);
388
+ // const iterator = deque.begin();
389
+ // expect(iterator.next().value).toBe(1);
390
+ // expect(iterator.next().value).toBe(2);
391
+ // });
392
+
393
+ // it('reverseBegin should yield elements in reverse order', () => {
394
+ // deque.push(1);
395
+ // deque.push(2);
396
+ // const iterator = deque.reverseBegin();
397
+ // expect(iterator.next().value).toBe(2);
398
+ // expect(iterator.next().value).toBe(1);
399
+ // });
400
400
  });
401
401
  describe('Deque - push Method', () => {
402
402
  let deque: Deque<number>;
@@ -411,7 +411,7 @@ describe('Deque - push Method', () => {
411
411
  it('push should add an element when deque is empty', () => {
412
412
  deque.push(1);
413
413
  expect(deque.last).toBe(1);
414
- expect(deque.size).toBe(1);
414
+ expect(deque.length).toBe(1);
415
415
  });
416
416
 
417
417
  it('push should add an element when lastInBucket is not at max', () => {
@@ -420,7 +420,7 @@ describe('Deque - push Method', () => {
420
420
  }
421
421
  deque.push(bucketSize);
422
422
  expect(deque.last).toBe(bucketSize);
423
- expect(deque.size).toBe(bucketSize);
423
+ expect(deque.length).toBe(bucketSize);
424
424
  });
425
425
 
426
426
  it('push should add an element and move to next bucket when last bucket is full', () => {
@@ -429,7 +429,7 @@ describe('Deque - push Method', () => {
429
429
  }
430
430
  deque.push(bucketSize + 1);
431
431
  expect(deque.last).toBe(bucketSize + 1);
432
- expect(deque.size).toBe(bucketSize + 1);
432
+ expect(deque.length).toBe(bucketSize + 1);
433
433
  });
434
434
 
435
435
  it('push should add an element and reallocate when last bucket and lastInBucket are at max', () => {
@@ -439,7 +439,7 @@ describe('Deque - push Method', () => {
439
439
 
440
440
  deque.push(100);
441
441
  expect(deque.last).toBe(100);
442
- expect(deque.size).toBeGreaterThan(bucketSize);
442
+ expect(deque.length).toBeGreaterThan(bucketSize);
443
443
  });
444
444
  });
445
445
  describe('Deque - pop Method', () => {
@@ -456,7 +456,7 @@ describe('Deque - pop Method', () => {
456
456
  deque.push(1);
457
457
  deque.push(2);
458
458
  expect(deque.pop()).toBe(2);
459
- expect(deque.size).toBe(1);
459
+ expect(deque.length).toBe(1);
460
460
  });
461
461
 
462
462
  it('pop should handle popping the only element', () => {
@@ -488,7 +488,7 @@ describe('Deque - unshift Method', () => {
488
488
  it('unshift should add an element to the beginning when deque is empty', () => {
489
489
  deque.unshift(1);
490
490
  expect(deque.first).toBe(1);
491
- expect(deque.size).toBe(1);
491
+ expect(deque.length).toBe(1);
492
492
  });
493
493
 
494
494
  it('unshift should add an element to the beginning and adjust firstInBucket', () => {
@@ -523,7 +523,7 @@ describe('Deque - shift Method', () => {
523
523
  deque.push(1);
524
524
  deque.push(2);
525
525
  expect(deque.shift()).toBe(1);
526
- expect(deque.size).toBe(1);
526
+ expect(deque.length).toBe(1);
527
527
  });
528
528
 
529
529
  it('shift should handle shifting the only element', () => {
@@ -543,6 +543,95 @@ describe('Deque - shift Method', () => {
543
543
  });
544
544
  });
545
545
 
546
+ describe('Deque Additional Methods', () => {
547
+ // Slice method implementation and test
548
+ test('slice should return a new list with specified range', () => {
549
+ const list = new Deque([1, 2, 3, 4, 5]);
550
+ const slicedList = list.slice(1, 4);
551
+
552
+ expect(slicedList.toArray()).toEqual([2, 3, 4]);
553
+ expect(list.length).toBe(5); // Original list unchanged
554
+ });
555
+
556
+ // Splice method implementation
557
+ test('splice should modify list and return removed elements', () => {
558
+ const list = new Deque([1, 2, 3, 4, 5]);
559
+ const removedList = list.splice(2, 2, 6, 7);
560
+
561
+ expect(list.toArray()).toEqual([1, 2, 6, 7, 5]);
562
+ expect(removedList.toArray()).toEqual([3, 4]);
563
+ });
564
+
565
+ // Concat method test
566
+ test('concat should combine multiple lists', () => {
567
+ const list1 = new Deque([1, 2]);
568
+ const list2 = new Deque([3, 4]);
569
+ const list3 = new Deque([5, 6]);
570
+
571
+ const concatenatedList = list1.concat(list2, list3);
572
+ expect(concatenatedList.toArray()).toEqual([1, 2, 3, 4, 5, 6]);
573
+ });
574
+
575
+ // Sort method test
576
+ test('sort should order elements in ascending order', () => {
577
+ const list = new Deque([5, 2, 8, 1, 9]);
578
+ list.sort((a, b) => a - b);
579
+
580
+ expect(list.toArray()).toEqual([1, 2, 5, 8, 9]);
581
+ });
582
+
583
+ // Reverse method test
584
+ test('reverse should invert the list order', () => {
585
+ const list = new Deque([1, 2, 3, 4, 5]);
586
+ list.reverse();
587
+
588
+ expect(list.toArray()).toEqual([5, 4, 3, 2, 1]);
589
+ });
590
+
591
+ // Join method test
592
+ test('join should convert list to string with separator', () => {
593
+ const list = new Deque(['a', 'b', 'c']);
594
+
595
+ expect(list.join('-')).toBe('a-b-c');
596
+ expect(list.join()).toBe('a,b,c');
597
+ });
598
+
599
+ // IndexOf method test
600
+ test('indexOf should return first occurrence index', () => {
601
+ const list = new Deque([1, 2, 3, 2, 1]);
602
+
603
+ expect(list.indexOf(2)).toBe(1);
604
+ expect(list.indexOf(4)).toBe(-1);
605
+ });
606
+
607
+ // LastIndexOf method test
608
+ test('lastIndexOf should return last occurrence index', () => {
609
+ const list = new Deque([1, 2, 3, 2, 1]);
610
+
611
+ expect(list.lastIndexOf(2)).toBe(3);
612
+ expect(list.lastIndexOf(4)).toBe(-1);
613
+ });
614
+
615
+ // findIndex method test
616
+ test('findIndex should return first occurrence index', () => {
617
+ const list = new Deque([1, 2, 3, 2, 1]);
618
+ expect(list.findIndex(item => item === 2)).toBe(1);
619
+ expect(list.findIndex(item => item === 4)).toBe(-1);
620
+ });
621
+
622
+ // fill method test
623
+ test('fill should return fill all the list', () => {
624
+ let list = new Deque([1, 2, 3, 2, 1]);
625
+ expect([...list.fill(9)]).toEqual([9, 9, 9, 9, 9]);
626
+ list = new Deque([1, 2, 3, 2, 1]);
627
+ expect([...list.fill(9, 2, 3)]).toEqual([1, 2, 9, 2, 1]);
628
+ list = new Deque([1, 2, 3, 2, 1]);
629
+ expect([...list.fill(9, -3, -2)]).toEqual([1, 2, 9, 2, 1]);
630
+ list = new Deque([1, 2, 3, 2, 1]);
631
+ expect([...list.fill(9, -2, -3)]).toEqual([1, 2, 3, 2, 1]);
632
+ });
633
+ });
634
+
546
635
  describe('Deque', () => {
547
636
  it('should initialize with default iterable with length function', () => {
548
637
  class IterableNumbers {
@@ -565,7 +654,7 @@ describe('Deque', () => {
565
654
 
566
655
  const numbers = new IterableNumbers([1, 6, 7, 3, 2, 4, 5]);
567
656
  const deque = new Deque(numbers, { bucketSize: 3 });
568
- expect(deque.size).toBe(7);
657
+ expect(deque.length).toBe(7);
569
658
  expect(deque.bucketSize).toBe(3);
570
659
  expect(deque.maxLen).toBe(-1);
571
660
  });
@@ -591,7 +680,7 @@ describe('Deque', () => {
591
680
 
592
681
  const numbers = new IterableNumbersWithSize([1, 6, 7, 3, 2, 4, 5]);
593
682
  const deque = new Deque(numbers, { bucketSize: 3 });
594
- expect(deque.size).toBe(7);
683
+ expect(deque.length).toBe(7);
595
684
  expect(deque.bucketSize).toBe(3);
596
685
  expect(deque.maxLen).toBe(-1);
597
686
  });
@@ -601,7 +690,7 @@ describe('Deque', () => {
601
690
  key: number;
602
691
  }> = [{ key: 1 }, { key: 6 }, { key: 7 }, { key: 3 }, { key: 2 }, { key: 4 }, { key: 5 }];
603
692
  const deque = new Deque<number>(objArr, { toElementFn: item => item.key });
604
- expect(deque.size).toBe(7);
693
+ expect(deque.length).toBe(7);
605
694
  expect(deque.has(1)).toBe(true);
606
695
  expect(deque.has(7)).toBe(true);
607
696
  expect(deque.has(8)).toBe(false);
@@ -612,7 +701,7 @@ describe('Deque', () => {
612
701
  key: number;
613
702
  }> = [{ key: 1 }, { key: 6 }, { key: 7 }, { key: 3 }, { key: 2 }, { key: 4 }, { key: 5 }];
614
703
  const deque = new Deque<number>(objArr, { toElementFn: item => item.key, bucketSize: 3 });
615
- expect(deque.size).toBe(7);
704
+ expect(deque.length).toBe(7);
616
705
  expect(deque.has(1)).toBe(true);
617
706
  expect(deque.bucketFirst).toBe(0);
618
707
  expect(deque.bucketLast).toBe(2);
@@ -628,7 +717,7 @@ describe('Deque', () => {
628
717
 
629
718
  it('should pop work well when bucket boundary is reached', () => {
630
719
  const deque = new Deque<number>([1, 6, 7, 3, 2, 4, 5], { bucketSize: 3 });
631
- expect(deque.size).toBe(7);
720
+ expect(deque.length).toBe(7);
632
721
  expect(deque.has(1)).toBe(true);
633
722
  expect(deque.bucketFirst).toBe(0);
634
723
  expect(deque.bucketLast).toBe(2);
@@ -641,7 +730,7 @@ describe('Deque', () => {
641
730
  [4, 5]
642
731
  ]);
643
732
  for (let i = 0; i < 3; ++i) deque.pop();
644
- expect(deque.size).toBe(4);
733
+ expect(deque.length).toBe(4);
645
734
  expect(deque.has(1)).toBe(true);
646
735
  expect(deque.bucketFirst).toBe(0);
647
736
  expect(deque.bucketLast).toBe(1);
@@ -654,7 +743,7 @@ describe('Deque', () => {
654
743
  [4, 5]
655
744
  ]); // TODO may be a problem
656
745
  deque.pop();
657
- expect(deque.size).toBe(3);
746
+ expect(deque.length).toBe(3);
658
747
  expect(deque.has(1)).toBe(true);
659
748
  expect(deque.bucketFirst).toBe(0);
660
749
  expect(deque.bucketLast).toBe(1);
@@ -670,7 +759,7 @@ describe('Deque', () => {
670
759
 
671
760
  it('should shift work well when bucket boundary is reached and should shrinkToFit', () => {
672
761
  const deque = new Deque<number>([1, 6, 7, 3, 2, 4, 5], { bucketSize: 3 });
673
- expect(deque.size).toBe(7);
762
+ expect(deque.length).toBe(7);
674
763
  expect(deque.has(1)).toBe(true);
675
764
  expect(deque.bucketFirst).toBe(0);
676
765
  expect(deque.bucketLast).toBe(2);
@@ -683,7 +772,7 @@ describe('Deque', () => {
683
772
  [4, 5]
684
773
  ]);
685
774
  for (let i = 0; i < 3; ++i) deque.shift();
686
- expect(deque.size).toBe(4);
775
+ expect(deque.length).toBe(4);
687
776
  expect(deque.has(1)).toBe(false);
688
777
  expect(deque.bucketFirst).toBe(1);
689
778
  expect(deque.bucketLast).toBe(2);
@@ -696,7 +785,7 @@ describe('Deque', () => {
696
785
  [4, 5]
697
786
  ]); // TODO may be a problem
698
787
  deque.shift();
699
- expect(deque.size).toBe(3);
788
+ expect(deque.length).toBe(3);
700
789
  expect(deque.has(1)).toBe(false);
701
790
  expect(deque.bucketFirst).toBe(1);
702
791
  expect(deque.bucketLast).toBe(2);
@@ -709,7 +798,7 @@ describe('Deque', () => {
709
798
  [4, 5]
710
799
  ]); // TODO may be a problem
711
800
  deque.shrinkToFit();
712
- expect(deque.size).toBe(3);
801
+ expect(deque.length).toBe(3);
713
802
  expect(deque.has(1)).toBe(false);
714
803
  expect(deque.bucketFirst).toBe(0);
715
804
  expect(deque.bucketLast).toBe(1);
@@ -722,3 +811,95 @@ describe('Deque', () => {
722
811
  ]); // TODO may be a problem
723
812
  });
724
813
  });
814
+
815
+ describe('classic uses', () => {
816
+ it('@example prize roulette', () => {
817
+ class PrizeRoulette {
818
+ private deque: Deque<string>;
819
+
820
+ constructor(prizes: string[]) {
821
+ // Initialize the deque with prizes
822
+ this.deque = new Deque<string>(prizes);
823
+ }
824
+
825
+ // Rotate clockwise to the right (forward)
826
+ rotateClockwise(steps: number): void {
827
+ const n = this.deque.length;
828
+ if (n === 0) return;
829
+
830
+ for (let i = 0; i < steps; i++) {
831
+ const last = this.deque.pop(); // Remove the last element
832
+ this.deque.unshift(last!); // Add it to the front
833
+ }
834
+ }
835
+
836
+ // Rotate counterclockwise to the left (backward)
837
+ rotateCounterClockwise(steps: number): void {
838
+ const n = this.deque.length;
839
+ if (n === 0) return;
840
+
841
+ for (let i = 0; i < steps; i++) {
842
+ const first = this.deque.shift(); // Remove the first element
843
+ this.deque.push(first!); // Add it to the back
844
+ }
845
+ }
846
+
847
+ // Display the current prize at the head
848
+ display() {
849
+ return this.deque.first;
850
+ }
851
+ }
852
+
853
+ // Example usage
854
+ const prizes = ['Car', 'Bike', 'Laptop', 'Phone', 'Watch', 'Headphones']; // Initialize the prize list
855
+ const roulette = new PrizeRoulette(prizes);
856
+
857
+ // Display the initial state
858
+ expect(roulette.display()).toBe('Car'); // Car
859
+
860
+ // Rotate clockwise by 3 steps
861
+ roulette.rotateClockwise(3);
862
+ expect(roulette.display()).toBe('Phone'); // Phone
863
+
864
+ // Rotate counterclockwise by 2 steps
865
+ roulette.rotateCounterClockwise(2);
866
+ expect(roulette.display()).toBe('Headphones'); // Headphones
867
+ });
868
+
869
+ it('@example sliding window', () => {
870
+ // Maximum function of sliding window
871
+ function maxSlidingWindow(nums: number[], k: number): number[] {
872
+ const n = nums.length;
873
+ if (n * k === 0) return [];
874
+
875
+ const deq = new Deque<number>();
876
+ const result: number[] = [];
877
+
878
+ for (let i = 0; i < n; i++) {
879
+ // Delete indexes in the queue that are not within the window range
880
+ if (deq.length > 0 && deq.first! === i - k) {
881
+ deq.shift();
882
+ }
883
+
884
+ // Remove all indices less than the current value from the tail of the queue
885
+ while (deq.length > 0 && nums[deq.last!] < nums[i]) {
886
+ deq.pop();
887
+ }
888
+
889
+ // Add the current index to the end of the queue
890
+ deq.push(i);
891
+
892
+ // Add the maximum value of the window to the results
893
+ if (i >= k - 1) {
894
+ result.push(nums[deq.first!]);
895
+ }
896
+ }
897
+
898
+ return result;
899
+ }
900
+
901
+ const nums = [1, 3, -1, -3, 5, 3, 6, 7];
902
+ const k = 3;
903
+ expect(maxSlidingWindow(nums, k)).toEqual([3, 3, 5, 5, 6, 7]); // Output: [3, 3, 5, 5, 6, 7]
904
+ });
905
+ });