data-structure-typed 1.52.3 → 1.52.5

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 (181) hide show
  1. package/CHANGELOG.md +2 -1
  2. package/README.md +13 -13
  3. package/README_zh-CN.md +216 -26
  4. package/benchmark/report.html +13 -13
  5. package/benchmark/report.json +158 -158
  6. package/dist/cjs/data-structures/base/iterable-element-base.d.ts +1 -37
  7. package/dist/cjs/data-structures/base/iterable-element-base.js +1 -37
  8. package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
  9. package/dist/cjs/data-structures/base/iterable-entry-base.d.ts +2 -54
  10. package/dist/cjs/data-structures/base/iterable-entry-base.js +1 -49
  11. package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
  12. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +0 -32
  13. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +9 -41
  14. package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
  15. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +0 -46
  16. package/dist/cjs/data-structures/binary-tree/avl-tree.js +0 -46
  17. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  18. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +82 -147
  19. package/dist/cjs/data-structures/binary-tree/binary-tree.js +299 -331
  20. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  21. package/dist/cjs/data-structures/binary-tree/bst.d.ts +1 -40
  22. package/dist/cjs/data-structures/binary-tree/bst.js +12 -44
  23. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  24. package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +0 -48
  25. package/dist/cjs/data-structures/binary-tree/rb-tree.js +2 -50
  26. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  27. package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +0 -32
  28. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +9 -41
  29. package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
  30. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +0 -75
  31. package/dist/cjs/data-structures/graph/abstract-graph.js +0 -75
  32. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  33. package/dist/cjs/data-structures/graph/directed-graph.d.ts +0 -98
  34. package/dist/cjs/data-structures/graph/directed-graph.js +0 -98
  35. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  36. package/dist/cjs/data-structures/graph/undirected-graph.d.ts +0 -50
  37. package/dist/cjs/data-structures/graph/undirected-graph.js +0 -50
  38. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  39. package/dist/cjs/data-structures/hash/hash-map.d.ts +5 -92
  40. package/dist/cjs/data-structures/hash/hash-map.js +29 -115
  41. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  42. package/dist/cjs/data-structures/heap/heap.d.ts +0 -32
  43. package/dist/cjs/data-structures/heap/heap.js +0 -32
  44. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  45. package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +5 -88
  46. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +5 -88
  47. package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
  48. package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +1 -83
  49. package/dist/cjs/data-structures/linked-list/singly-linked-list.js +2 -84
  50. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  51. package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +1 -35
  52. package/dist/cjs/data-structures/linked-list/skip-linked-list.js +1 -35
  53. package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
  54. package/dist/cjs/data-structures/queue/deque.d.ts +1 -98
  55. package/dist/cjs/data-structures/queue/deque.js +3 -99
  56. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  57. package/dist/cjs/data-structures/queue/queue.d.ts +5 -58
  58. package/dist/cjs/data-structures/queue/queue.js +4 -57
  59. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  60. package/dist/cjs/data-structures/stack/stack.d.ts +1 -34
  61. package/dist/cjs/data-structures/stack/stack.js +1 -34
  62. package/dist/cjs/data-structures/stack/stack.js.map +1 -1
  63. package/dist/cjs/data-structures/tree/tree.js +0 -1
  64. package/dist/cjs/data-structures/tree/tree.js.map +1 -1
  65. package/dist/cjs/data-structures/trie/trie.d.ts +0 -64
  66. package/dist/cjs/data-structures/trie/trie.js +0 -64
  67. package/dist/cjs/data-structures/trie/trie.js.map +1 -1
  68. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +8 -0
  69. package/dist/cjs/types/data-structures/binary-tree/binary-tree.js +6 -0
  70. package/dist/cjs/types/data-structures/binary-tree/binary-tree.js.map +1 -1
  71. package/dist/cjs/types/utils/utils.d.ts +13 -12
  72. package/dist/cjs/utils/number.d.ts +13 -0
  73. package/dist/cjs/utils/number.js +13 -0
  74. package/dist/cjs/utils/number.js.map +1 -1
  75. package/dist/cjs/utils/utils.d.ts +125 -3
  76. package/dist/cjs/utils/utils.js +177 -21
  77. package/dist/cjs/utils/utils.js.map +1 -1
  78. package/dist/mjs/data-structures/base/iterable-element-base.d.ts +1 -37
  79. package/dist/mjs/data-structures/base/iterable-element-base.js +1 -37
  80. package/dist/mjs/data-structures/base/iterable-entry-base.d.ts +2 -54
  81. package/dist/mjs/data-structures/base/iterable-entry-base.js +1 -49
  82. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +0 -32
  83. package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +9 -41
  84. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +0 -46
  85. package/dist/mjs/data-structures/binary-tree/avl-tree.js +0 -46
  86. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +82 -147
  87. package/dist/mjs/data-structures/binary-tree/binary-tree.js +298 -332
  88. package/dist/mjs/data-structures/binary-tree/bst.d.ts +1 -40
  89. package/dist/mjs/data-structures/binary-tree/bst.js +12 -44
  90. package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +0 -48
  91. package/dist/mjs/data-structures/binary-tree/rb-tree.js +2 -50
  92. package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +0 -32
  93. package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +9 -41
  94. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +0 -75
  95. package/dist/mjs/data-structures/graph/abstract-graph.js +0 -75
  96. package/dist/mjs/data-structures/graph/directed-graph.d.ts +0 -98
  97. package/dist/mjs/data-structures/graph/directed-graph.js +0 -98
  98. package/dist/mjs/data-structures/graph/undirected-graph.d.ts +0 -50
  99. package/dist/mjs/data-structures/graph/undirected-graph.js +0 -50
  100. package/dist/mjs/data-structures/hash/hash-map.d.ts +5 -92
  101. package/dist/mjs/data-structures/hash/hash-map.js +29 -115
  102. package/dist/mjs/data-structures/heap/heap.d.ts +0 -32
  103. package/dist/mjs/data-structures/heap/heap.js +0 -32
  104. package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +5 -88
  105. package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +5 -88
  106. package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +1 -83
  107. package/dist/mjs/data-structures/linked-list/singly-linked-list.js +2 -84
  108. package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +1 -35
  109. package/dist/mjs/data-structures/linked-list/skip-linked-list.js +1 -35
  110. package/dist/mjs/data-structures/queue/deque.d.ts +1 -98
  111. package/dist/mjs/data-structures/queue/deque.js +3 -99
  112. package/dist/mjs/data-structures/queue/queue.d.ts +5 -58
  113. package/dist/mjs/data-structures/queue/queue.js +4 -57
  114. package/dist/mjs/data-structures/stack/stack.d.ts +1 -34
  115. package/dist/mjs/data-structures/stack/stack.js +1 -34
  116. package/dist/mjs/data-structures/tree/tree.js +0 -1
  117. package/dist/mjs/data-structures/trie/trie.d.ts +0 -64
  118. package/dist/mjs/data-structures/trie/trie.js +0 -64
  119. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +8 -0
  120. package/dist/mjs/types/data-structures/binary-tree/binary-tree.js +5 -1
  121. package/dist/mjs/types/utils/utils.d.ts +13 -12
  122. package/dist/mjs/utils/number.d.ts +13 -0
  123. package/dist/mjs/utils/number.js +13 -0
  124. package/dist/mjs/utils/utils.d.ts +125 -3
  125. package/dist/mjs/utils/utils.js +177 -21
  126. package/dist/umd/data-structure-typed.js +414 -1482
  127. package/dist/umd/data-structure-typed.min.js +5 -4
  128. package/dist/umd/data-structure-typed.min.js.map +1 -1
  129. package/package.json +6 -6
  130. package/src/data-structures/base/iterable-element-base.ts +2 -42
  131. package/src/data-structures/base/iterable-entry-base.ts +3 -62
  132. package/src/data-structures/binary-tree/avl-tree-multi-map.ts +8 -48
  133. package/src/data-structures/binary-tree/avl-tree.ts +0 -57
  134. package/src/data-structures/binary-tree/binary-tree.ts +329 -358
  135. package/src/data-structures/binary-tree/bst.ts +11 -54
  136. package/src/data-structures/binary-tree/rb-tree.ts +2 -62
  137. package/src/data-structures/binary-tree/tree-multi-map.ts +8 -48
  138. package/src/data-structures/graph/abstract-graph.ts +0 -92
  139. package/src/data-structures/graph/directed-graph.ts +0 -122
  140. package/src/data-structures/graph/undirected-graph.ts +0 -62
  141. package/src/data-structures/hash/hash-map.ts +31 -139
  142. package/src/data-structures/heap/heap.ts +0 -40
  143. package/src/data-structures/linked-list/doubly-linked-list.ts +5 -112
  144. package/src/data-structures/linked-list/singly-linked-list.ts +2 -104
  145. package/src/data-structures/linked-list/skip-linked-list.ts +1 -44
  146. package/src/data-structures/queue/deque.ts +2 -125
  147. package/src/data-structures/queue/queue.ts +5 -72
  148. package/src/data-structures/stack/stack.ts +1 -43
  149. package/src/data-structures/tree/tree.ts +1 -1
  150. package/src/data-structures/trie/trie.ts +0 -80
  151. package/src/types/data-structures/binary-tree/binary-tree.ts +8 -1
  152. package/src/types/utils/utils.ts +17 -15
  153. package/src/utils/number.ts +13 -0
  154. package/src/utils/utils.ts +174 -18
  155. package/test/config.ts +8 -0
  156. package/test/integration/all-in-one.test.ts +1 -1
  157. package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +13 -13
  158. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +18 -13
  159. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +471 -64
  160. package/test/unit/data-structures/binary-tree/bst.test.ts +167 -23
  161. package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
  162. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +136 -13
  163. package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +18 -13
  164. package/test/unit/data-structures/graph/directed-graph.test.ts +46 -32
  165. package/test/unit/data-structures/graph/map-graph.test.ts +24 -2
  166. package/test/unit/data-structures/graph/undirected-graph.test.ts +24 -24
  167. package/test/unit/data-structures/hash/hash-map.test.ts +225 -35
  168. package/test/unit/data-structures/heap/heap.test.ts +47 -39
  169. package/test/unit/data-structures/heap/min-heap.test.ts +5 -5
  170. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +34 -4
  171. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +32 -0
  172. package/test/unit/data-structures/matrix/matrix.test.ts +35 -5
  173. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +31 -0
  174. package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +18 -0
  175. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +17 -0
  176. package/test/unit/data-structures/queue/deque.test.ts +288 -47
  177. package/test/unit/data-structures/queue/queue.test.ts +62 -37
  178. package/test/unit/data-structures/stack/stack.test.ts +30 -5
  179. package/test/unit/data-structures/tree/tree.test.ts +58 -0
  180. package/test/unit/data-structures/trie/trie.test.ts +46 -5
  181. package/test/unit/utils/utils.test.ts +169 -0
@@ -10,19 +10,19 @@ describe('Deque - Basic Operations', () => {
10
10
  deque = new Deque<number>([1, 2]);
11
11
  });
12
12
 
13
- test('push should add elements to the end', () => {
13
+ it('push should add elements to the end', () => {
14
14
  expect(deque.size).toBe(2);
15
15
  expect(deque.last).toBe(2);
16
16
  });
17
17
 
18
- test('pop should remove elements from the end', () => {
18
+ it('pop should remove elements from the end', () => {
19
19
  expect(deque.pop()).toBe(2);
20
20
  expect(deque.size).toBe(1);
21
21
  expect(deque.pop()).toBe(1);
22
22
  expect(deque.isEmpty()).toBeTruthy();
23
23
  });
24
24
 
25
- test('unshift should add elements to the beginning', () => {
25
+ it('unshift should add elements to the beginning', () => {
26
26
  deque.clear();
27
27
  deque.unshift(1);
28
28
  deque.unshift(2);
@@ -30,7 +30,7 @@ describe('Deque - Basic Operations', () => {
30
30
  expect(deque.first).toBe(2);
31
31
  });
32
32
 
33
- test('shift should remove elements from the beginning', () => {
33
+ it('shift should remove elements from the beginning', () => {
34
34
  deque.clear();
35
35
  deque.unshift(1);
36
36
  deque.unshift(2);
@@ -40,17 +40,17 @@ describe('Deque - Basic Operations', () => {
40
40
  expect(deque.isEmpty()).toBeTruthy();
41
41
  });
42
42
 
43
- test('at should retrieve the correct element', () => {
43
+ it('at should retrieve the correct element', () => {
44
44
  expect(deque.at(0)).toBe(1);
45
45
  expect(deque.at(1)).toBe(2);
46
46
  });
47
47
 
48
- test('setAt should set the correct element', () => {
48
+ it('setAt should set the correct element', () => {
49
49
  deque.setAt(0, 3);
50
50
  expect(deque.at(0)).toBe(3);
51
51
  });
52
52
 
53
- test('should at after shifting', () => {
53
+ it('should at after shifting', () => {
54
54
  deque.clear();
55
55
  for (let i = 0; i < 100; i++) {
56
56
  deque.push(i);
@@ -65,7 +65,7 @@ describe('Deque - Basic Operations', () => {
65
65
  }
66
66
  });
67
67
 
68
- test('should at after popping', () => {
68
+ it('should at after popping', () => {
69
69
  deque.clear();
70
70
  for (let i = 0; i < 100; i++) {
71
71
  deque.push(i);
@@ -115,14 +115,14 @@ describe('Deque - Complex Operations', () => {
115
115
  deque = new Deque<number>();
116
116
  });
117
117
 
118
- test('addAt should insert elements at the specified position', () => {
119
- deque.push(1);
120
- deque.push(3);
118
+ it('addAt should insert elements at the specified position', () => {
119
+ deque.addAt(0, 1);
120
+ deque.addAt(1, 3);
121
121
  deque.addAt(1, 2);
122
122
  expect(deque.toArray()).toEqual([1, 2, 3]);
123
123
  });
124
124
 
125
- test('cut should remove elements after the specified position', () => {
125
+ it('cut should remove elements after the specified position', () => {
126
126
  deque.push(1);
127
127
  deque.push(2);
128
128
  deque.push(3);
@@ -136,9 +136,17 @@ describe('Deque - Complex Operations', () => {
136
136
  expect([...dq1.cut(3, true)]).toEqual([1, 2, 3, 4]);
137
137
  expect(dq1.size).toBe(4);
138
138
  expect([...dq1]).toEqual([1, 2, 3, 4]);
139
+ const dqCut = dq1.cut(2);
140
+ expect(dqCut.toArray()).toEqual([1, 2, 3]);
141
+ const dqCutFromBeginning = dqCut.cut(0, true);
142
+ expect(dqCutFromBeginning.toArray()).toEqual([1]);
143
+ dqCutFromBeginning.cut(-1, true);
144
+ expect(dqCutFromBeginning.toArray()).toEqual([]);
145
+ const dqCutFromNegative = dqCutFromBeginning.cut(-1);
146
+ expect([...dqCutFromNegative]).toEqual([]);
139
147
  });
140
148
 
141
- test('cutRest should remove elements after the specified position', () => {
149
+ it('cutRest should remove elements after the specified position', () => {
142
150
  deque.push(1);
143
151
  deque.push(2);
144
152
  deque.push(3);
@@ -160,17 +168,28 @@ describe('Deque - Complex Operations', () => {
160
168
  const dq1 = new Deque([1, 2, 3, 4, 5, 6, 7]);
161
169
  expect([...dq1.cutRest(3)]).toEqual([4, 5, 6, 7]);
162
170
  expect([...dq1]).toEqual([1, 2, 3, 4, 5, 6, 7]);
171
+ const dq2 = dq1.cutRest(0, true);
172
+ expect(dq2.toArray()).toEqual([1, 2, 3, 4, 5, 6, 7]);
173
+ dq2.cutRest(-1, true);
174
+ expect(dq2.toArray()).toEqual([1, 2, 3, 4, 5, 6, 7]);
175
+ const dq3 = dq2.cutRest(-1);
176
+ expect([...dq3]).toEqual([1, 2, 3, 4, 5, 6, 7]);
163
177
  });
164
178
 
165
- test('deleteAt should remove the element at the specified position', () => {
179
+ it('deleteAt should remove the element at the specified position', () => {
166
180
  deque.push(1);
167
181
  deque.push(2);
168
182
  deque.push(3);
169
183
  deque.deleteAt(1);
170
184
  expect(deque.toArray()).toEqual([1, 3]);
185
+ deque.deleteAt(1);
186
+ deque.deleteAt(0);
187
+ expect(deque.toArray()).toEqual([]);
171
188
  });
172
189
 
173
- test('delete should remove all instances of an element', () => {
190
+ it('delete should remove all instances of an element', () => {
191
+ deque.delete(2);
192
+ expect(deque.toArray()).toEqual([]);
174
193
  deque.push(1);
175
194
  deque.push(2);
176
195
  deque.push(2);
@@ -179,7 +198,7 @@ describe('Deque - Complex Operations', () => {
179
198
  expect(deque.toArray()).toEqual([1, 3]);
180
199
  });
181
200
 
182
- test('reverse should reverse the order of elements', () => {
201
+ it('reverse should reverse the order of elements', () => {
183
202
  deque.push(1);
184
203
  deque.push(2);
185
204
  deque.push(3);
@@ -187,16 +206,19 @@ describe('Deque - Complex Operations', () => {
187
206
  expect(deque.toArray()).toEqual([3, 2, 1]);
188
207
  });
189
208
 
190
- test('unique should remove duplicate elements', () => {
209
+ it('unique should remove duplicate elements', () => {
191
210
  deque.push(1);
211
+ const noNeedUnique = deque.unique();
212
+ expect(noNeedUnique).toBe(deque);
192
213
  deque.push(2);
193
214
  deque.push(2);
194
215
  deque.push(3);
195
- deque.unique();
216
+ const uniquer = deque.unique();
217
+ expect(uniquer).toBe(deque);
196
218
  expect(deque.toArray()).toEqual([1, 2, 3]);
197
219
  });
198
220
 
199
- test('sort should sort elements according to a comparator', () => {
221
+ it('sort should sort elements according to a comparator', () => {
200
222
  deque.push(3);
201
223
  deque.push(1);
202
224
  deque.push(2);
@@ -204,7 +226,43 @@ describe('Deque - Complex Operations', () => {
204
226
  expect([...deque]).toEqual([1, 2, 3]);
205
227
  });
206
228
 
207
- test('shrinkToFit should reduce the memory footprint', () => {});
229
+ it('shrinkToFit should reduce the memory footprint', () => {
230
+ deque.shrinkToFit();
231
+ expect(deque.size).toBe(0);
232
+ expect(deque.has(1)).toBe(false);
233
+ expect(deque.bucketFirst).toBe(0);
234
+ expect(deque.bucketLast).toBe(0);
235
+ expect(deque.firstInBucket).toBe(2048);
236
+ expect(deque.lastInBucket).toBe(2048);
237
+ expect(deque.bucketCount).toBe(1);
238
+ expect(deque.buckets[0][0]).toEqual(undefined);
239
+ expect(deque.buckets.length).toEqual(1);
240
+ deque.push(1);
241
+ deque.shrinkToFit();
242
+
243
+ deque = new Deque([1, 2, 3, 4, 5], { bucketSize: 2 });
244
+ expect(deque.size).toBe(5);
245
+ expect(deque.has(1)).toBe(true);
246
+ expect(deque.bucketFirst).toBe(0);
247
+ expect(deque.bucketLast).toBe(2);
248
+ expect(deque.firstInBucket).toBe(0);
249
+ expect(deque.lastInBucket).toBe(0);
250
+ expect(deque.bucketCount).toBe(3);
251
+ expect(deque.buckets[0][0]).toBe(1);
252
+ expect(deque.buckets[2][0]).toBe(5);
253
+ expect(deque.buckets.length).toBe(3);
254
+ deque.shrinkToFit();
255
+ expect(deque.buckets).toEqual([[1, 2], [3, 4], [5]]);
256
+ deque.push(6);
257
+ deque.push(7);
258
+ deque.shrinkToFit();
259
+ expect(deque.buckets).toEqual([
260
+ [1, 2],
261
+ [3, 4],
262
+ [5, 6],
263
+ [7, 2]
264
+ ]);
265
+ });
208
266
  });
209
267
  describe('Deque - Utility Operations', () => {
210
268
  let deque: Deque<number>;
@@ -213,7 +271,8 @@ describe('Deque - Utility Operations', () => {
213
271
  deque = new Deque<number>();
214
272
  });
215
273
 
216
- test('find should return the first element that matches the condition', () => {
274
+ it('find should return the first element that matches the condition', () => {
275
+ expect(deque.first).toBe(undefined);
217
276
  deque.push(1);
218
277
  deque.push(2);
219
278
  deque.push(3);
@@ -221,22 +280,23 @@ describe('Deque - Utility Operations', () => {
221
280
  expect(found).toBe(2);
222
281
  });
223
282
 
224
- test('indexOf should return the index of the first occurrence of an element', () => {
283
+ it('indexOf should return the index of the first occurrence of an element', () => {
225
284
  deque.push(1);
226
285
  deque.push(2);
227
286
  deque.push(3);
228
287
  const index = deque.indexOf(2);
229
288
  expect(index).toBe(1);
289
+ expect(deque.indexOf(4)).toBe(-1);
230
290
  });
231
291
 
232
- test('toArray should convert the deque to an array', () => {
292
+ it('toArray should convert the deque to an array', () => {
233
293
  deque.push(1);
234
294
  deque.push(2);
235
295
  deque.push(3);
236
296
  expect(deque.toArray()).toEqual([1, 2, 3]);
237
297
  });
238
298
 
239
- test('filter should filter elements based on a predicate', () => {
299
+ it('filter should filter elements based on a predicate', () => {
240
300
  deque.push(1);
241
301
  deque.push(2);
242
302
  deque.push(3);
@@ -244,7 +304,7 @@ describe('Deque - Utility Operations', () => {
244
304
  expect(filtered.toArray()).toEqual([2, 3]);
245
305
  });
246
306
 
247
- test('map should apply a function to all elements', () => {
307
+ it('map should apply a function to all elements', () => {
248
308
  deque.push(1);
249
309
  deque.push(2);
250
310
  deque.push(3);
@@ -252,7 +312,7 @@ describe('Deque - Utility Operations', () => {
252
312
  expect(mapped.toArray()).toEqual([2, 4, 6]);
253
313
  });
254
314
 
255
- test('print should print the deque elements', () => {
315
+ it('print should print the deque elements', () => {
256
316
  // const consoleSpy = jest.spyOn(console, 'log');
257
317
  // deque.push(1);
258
318
  // deque.push(2);
@@ -260,7 +320,7 @@ describe('Deque - Utility Operations', () => {
260
320
  // expect(consoleSpy).toHaveBeenCalledWith([1, 2]);
261
321
  });
262
322
 
263
- test('should maxLen work well', () => {
323
+ it('should maxLen work well', () => {
264
324
  const dequeMaxLen = new Deque([3, 4, 5, 6, 7], { maxLen: 3 });
265
325
  expect(dequeMaxLen.size).toBe(3);
266
326
  expect(dequeMaxLen.toArray()).toEqual([5, 6, 7]);
@@ -286,42 +346,43 @@ describe('Deque - Additional Operations', () => {
286
346
  deque = new Deque<number>();
287
347
  });
288
348
 
289
- test('push should add an element to the end', () => {
349
+ it('push should add an element to the end', () => {
290
350
  deque.push(1);
291
351
  deque.push(2);
292
352
  expect(deque.last).toBe(2);
293
353
  expect(deque.size).toBe(2);
294
354
  });
295
355
 
296
- test('pop should remove and return the last element', () => {
356
+ it('pop should remove and return the last element', () => {
297
357
  deque.push(1);
298
358
  deque.push(2);
299
359
  expect(deque.pop()).toBe(2);
300
360
  expect(deque.size).toBe(1);
301
361
  });
302
362
 
303
- test('unshift should add an element to the beginning', () => {
363
+ it('unshift should add an element to the beginning', () => {
304
364
  deque.unshift(1);
305
365
  deque.unshift(2);
306
366
  expect(deque.first).toBe(2);
307
367
  expect(deque.size).toBe(2);
308
368
  });
309
369
 
310
- test('shift should remove and return the first element', () => {
370
+ it('shift should remove and return the first element', () => {
371
+ deque.shift();
311
372
  deque.unshift(1);
312
373
  deque.unshift(2);
313
374
  expect(deque.shift()).toBe(2);
314
375
  expect(deque.size).toBe(1);
315
376
  });
316
377
 
317
- test('clear should reset the deque', () => {
378
+ it('clear should reset the deque', () => {
318
379
  deque.unshift(1);
319
380
  deque.clear();
320
381
  expect(deque.size).toBe(0);
321
382
  expect(deque.isEmpty()).toBeTruthy();
322
383
  });
323
384
 
324
- test('begin should yield elements from the beginning', () => {
385
+ it('begin should yield elements from the beginning', () => {
325
386
  deque.push(1);
326
387
  deque.push(2);
327
388
  const iterator = deque.begin();
@@ -329,7 +390,7 @@ describe('Deque - Additional Operations', () => {
329
390
  expect(iterator.next().value).toBe(2);
330
391
  });
331
392
 
332
- test('reverseBegin should yield elements in reverse order', () => {
393
+ it('reverseBegin should yield elements in reverse order', () => {
333
394
  deque.push(1);
334
395
  deque.push(2);
335
396
  const iterator = deque.reverseBegin();
@@ -347,13 +408,13 @@ describe('Deque - push Method', () => {
347
408
  });
348
409
  });
349
410
 
350
- test('push should add an element when deque is empty', () => {
411
+ it('push should add an element when deque is empty', () => {
351
412
  deque.push(1);
352
413
  expect(deque.last).toBe(1);
353
414
  expect(deque.size).toBe(1);
354
415
  });
355
416
 
356
- test('push should add an element when lastInBucket is not at max', () => {
417
+ it('push should add an element when lastInBucket is not at max', () => {
357
418
  for (let i = 0; i < bucketSize - 1; i++) {
358
419
  deque.push(i);
359
420
  }
@@ -362,7 +423,7 @@ describe('Deque - push Method', () => {
362
423
  expect(deque.size).toBe(bucketSize);
363
424
  });
364
425
 
365
- test('push should add an element and move to next bucket when last bucket is full', () => {
426
+ it('push should add an element and move to next bucket when last bucket is full', () => {
366
427
  for (let i = 0; i < bucketSize; i++) {
367
428
  deque.push(i);
368
429
  }
@@ -371,7 +432,7 @@ describe('Deque - push Method', () => {
371
432
  expect(deque.size).toBe(bucketSize + 1);
372
433
  });
373
434
 
374
- test('push should add an element and reallocate when last bucket and lastInBucket are at max', () => {
435
+ it('push should add an element and reallocate when last bucket and lastInBucket are at max', () => {
375
436
  for (let i = 0; i < 100; i++) {
376
437
  deque.push(i);
377
438
  }
@@ -391,20 +452,20 @@ describe('Deque - pop Method', () => {
391
452
  });
392
453
  });
393
454
 
394
- test('pop should remove and return the last element', () => {
455
+ it('pop should remove and return the last element', () => {
395
456
  deque.push(1);
396
457
  deque.push(2);
397
458
  expect(deque.pop()).toBe(2);
398
459
  expect(deque.size).toBe(1);
399
460
  });
400
461
 
401
- test('pop should handle popping the only element', () => {
462
+ it('pop should handle popping the only element', () => {
402
463
  deque.push(1);
403
464
  expect(deque.pop()).toBe(1);
404
465
  expect(deque.isEmpty()).toBeTruthy();
405
466
  });
406
467
 
407
- test('pop should adjust bucketLast and lastInBucket correctly', () => {
468
+ it('pop should adjust bucketLast and lastInBucket correctly', () => {
408
469
  for (let i = 0; i < 100; i++) {
409
470
  deque.push(i);
410
471
  }
@@ -424,13 +485,13 @@ describe('Deque - unshift Method', () => {
424
485
  });
425
486
  });
426
487
 
427
- test('unshift should add an element to the beginning when deque is empty', () => {
488
+ it('unshift should add an element to the beginning when deque is empty', () => {
428
489
  deque.unshift(1);
429
490
  expect(deque.first).toBe(1);
430
491
  expect(deque.size).toBe(1);
431
492
  });
432
493
 
433
- test('unshift should add an element to the beginning and adjust firstInBucket', () => {
494
+ it('unshift should add an element to the beginning and adjust firstInBucket', () => {
434
495
  for (let i = 0; i < 100; i++) {
435
496
  deque.unshift(i);
436
497
  }
@@ -439,7 +500,7 @@ describe('Deque - unshift Method', () => {
439
500
  expect(deque.first).toBe(0);
440
501
  });
441
502
 
442
- test('unshift should add an element and reallocate when needed', () => {
503
+ it('unshift should add an element and reallocate when needed', () => {
443
504
  for (let i = 0; i < 100; i++) {
444
505
  deque.unshift(i);
445
506
  }
@@ -458,20 +519,20 @@ describe('Deque - shift Method', () => {
458
519
  });
459
520
  });
460
521
 
461
- test('shift should remove and return the first element', () => {
522
+ it('shift should remove and return the first element', () => {
462
523
  deque.push(1);
463
524
  deque.push(2);
464
525
  expect(deque.shift()).toBe(1);
465
526
  expect(deque.size).toBe(1);
466
527
  });
467
528
 
468
- test('shift should handle shifting the only element', () => {
529
+ it('shift should handle shifting the only element', () => {
469
530
  deque.push(1);
470
531
  expect(deque.shift()).toBe(1);
471
532
  expect(deque.isEmpty()).toBeTruthy();
472
533
  });
473
534
 
474
- test('shift should adjust bucketFirst and firstInBucket correctly', () => {
535
+ it('shift should adjust bucketFirst and firstInBucket correctly', () => {
475
536
  for (let i = 0; i < 100; i++) {
476
537
  deque.push(i);
477
538
  }
@@ -481,3 +542,183 @@ describe('Deque - shift Method', () => {
481
542
  }
482
543
  });
483
544
  });
545
+
546
+ describe('Deque', () => {
547
+ it('should initialize with default iterable with length function', () => {
548
+ class IterableNumbers {
549
+ private readonly _elements: number[] = [];
550
+
551
+ constructor(elements: number[]) {
552
+ this._elements = elements;
553
+ }
554
+
555
+ *[Symbol.iterator]() {
556
+ for (let i = 0; i < this._elements.length; ++i) {
557
+ yield this._elements[i];
558
+ }
559
+ }
560
+
561
+ length() {
562
+ return this._elements.length;
563
+ }
564
+ }
565
+
566
+ const numbers = new IterableNumbers([1, 6, 7, 3, 2, 4, 5]);
567
+ const deque = new Deque(numbers, { bucketSize: 3 });
568
+ expect(deque.size).toBe(7);
569
+ expect(deque.bucketSize).toBe(3);
570
+ expect(deque.maxLen).toBe(-1);
571
+ });
572
+
573
+ it('should initialize with default iterable with size function', () => {
574
+ class IterableNumbersWithSize {
575
+ private readonly _elements: number[] = [];
576
+
577
+ constructor(elements: number[]) {
578
+ this._elements = elements;
579
+ }
580
+
581
+ *[Symbol.iterator]() {
582
+ for (let i = 0; i < this._elements.length; ++i) {
583
+ yield this._elements[i];
584
+ }
585
+ }
586
+
587
+ size() {
588
+ return this._elements.length;
589
+ }
590
+ }
591
+
592
+ const numbers = new IterableNumbersWithSize([1, 6, 7, 3, 2, 4, 5]);
593
+ const deque = new Deque(numbers, { bucketSize: 3 });
594
+ expect(deque.size).toBe(7);
595
+ expect(deque.bucketSize).toBe(3);
596
+ expect(deque.maxLen).toBe(-1);
597
+ });
598
+
599
+ it('should initialize via toElementFn', () => {
600
+ const objArr: Array<{
601
+ key: number;
602
+ }> = [{ key: 1 }, { key: 6 }, { key: 7 }, { key: 3 }, { key: 2 }, { key: 4 }, { key: 5 }];
603
+ const deque = new Deque<number>(objArr, { toElementFn: item => item.key });
604
+ expect(deque.size).toBe(7);
605
+ expect(deque.has(1)).toBe(true);
606
+ expect(deque.has(7)).toBe(true);
607
+ expect(deque.has(8)).toBe(false);
608
+ });
609
+
610
+ it('should bucket properties are correct', () => {
611
+ const objArr: Array<{
612
+ key: number;
613
+ }> = [{ key: 1 }, { key: 6 }, { key: 7 }, { key: 3 }, { key: 2 }, { key: 4 }, { key: 5 }];
614
+ const deque = new Deque<number>(objArr, { toElementFn: item => item.key, bucketSize: 3 });
615
+ expect(deque.size).toBe(7);
616
+ expect(deque.has(1)).toBe(true);
617
+ expect(deque.bucketFirst).toBe(0);
618
+ expect(deque.bucketLast).toBe(2);
619
+ expect(deque.firstInBucket).toBe(1);
620
+ expect(deque.lastInBucket).toBe(1); // TODO may be a problem
621
+ expect(deque.bucketCount).toBe(3);
622
+ expect(deque.buckets).toEqual([
623
+ [, 1, 6],
624
+ [7, 3, 2],
625
+ [4, 5]
626
+ ]);
627
+ });
628
+
629
+ it('should pop work well when bucket boundary is reached', () => {
630
+ const deque = new Deque<number>([1, 6, 7, 3, 2, 4, 5], { bucketSize: 3 });
631
+ expect(deque.size).toBe(7);
632
+ expect(deque.has(1)).toBe(true);
633
+ expect(deque.bucketFirst).toBe(0);
634
+ expect(deque.bucketLast).toBe(2);
635
+ expect(deque.firstInBucket).toBe(1);
636
+ expect(deque.lastInBucket).toBe(1); // TODO may be a problem
637
+ expect(deque.bucketCount).toBe(3);
638
+ expect(deque.buckets).toEqual([
639
+ [, 1, 6],
640
+ [7, 3, 2],
641
+ [4, 5]
642
+ ]);
643
+ for (let i = 0; i < 3; ++i) deque.pop();
644
+ expect(deque.size).toBe(4);
645
+ expect(deque.has(1)).toBe(true);
646
+ expect(deque.bucketFirst).toBe(0);
647
+ expect(deque.bucketLast).toBe(1);
648
+ expect(deque.firstInBucket).toBe(1);
649
+ expect(deque.lastInBucket).toBe(1);
650
+ expect(deque.bucketCount).toBe(3);
651
+ expect(deque.buckets).toEqual([
652
+ [, 1, 6],
653
+ [7, 3, 2],
654
+ [4, 5]
655
+ ]); // TODO may be a problem
656
+ deque.pop();
657
+ expect(deque.size).toBe(3);
658
+ expect(deque.has(1)).toBe(true);
659
+ expect(deque.bucketFirst).toBe(0);
660
+ expect(deque.bucketLast).toBe(1);
661
+ expect(deque.firstInBucket).toBe(1);
662
+ expect(deque.lastInBucket).toBe(0);
663
+ expect(deque.bucketCount).toBe(3);
664
+ expect(deque.buckets).toEqual([
665
+ [, 1, 6],
666
+ [7, 3, 2],
667
+ [4, 5]
668
+ ]); // TODO may be a problem
669
+ });
670
+
671
+ it('should shift work well when bucket boundary is reached and should shrinkToFit', () => {
672
+ const deque = new Deque<number>([1, 6, 7, 3, 2, 4, 5], { bucketSize: 3 });
673
+ expect(deque.size).toBe(7);
674
+ expect(deque.has(1)).toBe(true);
675
+ expect(deque.bucketFirst).toBe(0);
676
+ expect(deque.bucketLast).toBe(2);
677
+ expect(deque.firstInBucket).toBe(1);
678
+ expect(deque.lastInBucket).toBe(1); // TODO may be a problem
679
+ expect(deque.bucketCount).toBe(3);
680
+ expect(deque.buckets).toEqual([
681
+ [, 1, 6],
682
+ [7, 3, 2],
683
+ [4, 5]
684
+ ]);
685
+ for (let i = 0; i < 3; ++i) deque.shift();
686
+ expect(deque.size).toBe(4);
687
+ expect(deque.has(1)).toBe(false);
688
+ expect(deque.bucketFirst).toBe(1);
689
+ expect(deque.bucketLast).toBe(2);
690
+ expect(deque.firstInBucket).toBe(1);
691
+ expect(deque.lastInBucket).toBe(1);
692
+ expect(deque.bucketCount).toBe(3);
693
+ expect(deque.buckets).toEqual([
694
+ [, 1, 6],
695
+ [7, 3, 2],
696
+ [4, 5]
697
+ ]); // TODO may be a problem
698
+ deque.shift();
699
+ expect(deque.size).toBe(3);
700
+ expect(deque.has(1)).toBe(false);
701
+ expect(deque.bucketFirst).toBe(1);
702
+ expect(deque.bucketLast).toBe(2);
703
+ expect(deque.firstInBucket).toBe(2);
704
+ expect(deque.lastInBucket).toBe(1);
705
+ expect(deque.bucketCount).toBe(3);
706
+ expect(deque.buckets).toEqual([
707
+ [, 1, 6],
708
+ [7, 3, 2],
709
+ [4, 5]
710
+ ]); // TODO may be a problem
711
+ deque.shrinkToFit();
712
+ expect(deque.size).toBe(3);
713
+ expect(deque.has(1)).toBe(false);
714
+ expect(deque.bucketFirst).toBe(0);
715
+ expect(deque.bucketLast).toBe(1);
716
+ expect(deque.firstInBucket).toBe(2);
717
+ expect(deque.lastInBucket).toBe(1);
718
+ expect(deque.bucketCount).toBe(3);
719
+ expect(deque.buckets).toEqual([
720
+ [7, 3, 2],
721
+ [4, 5]
722
+ ]); // TODO may be a problem
723
+ });
724
+ });