data-structure-typed 1.52.4 → 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.
- package/CHANGELOG.md +1 -1
- package/README.md +13 -13
- package/README_zh-CN.md +216 -26
- package/benchmark/report.html +13 -13
- package/benchmark/report.json +158 -158
- package/dist/cjs/data-structures/base/iterable-element-base.d.ts +1 -37
- package/dist/cjs/data-structures/base/iterable-element-base.js +1 -37
- package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/cjs/data-structures/base/iterable-entry-base.d.ts +2 -54
- package/dist/cjs/data-structures/base/iterable-entry-base.js +1 -49
- package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +0 -32
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +9 -41
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +0 -46
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +0 -46
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +82 -147
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +299 -331
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +1 -40
- package/dist/cjs/data-structures/binary-tree/bst.js +12 -44
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +0 -48
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +2 -50
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +0 -32
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +9 -41
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +0 -75
- package/dist/cjs/data-structures/graph/abstract-graph.js +0 -75
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.d.ts +0 -98
- package/dist/cjs/data-structures/graph/directed-graph.js +0 -98
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.d.ts +0 -50
- package/dist/cjs/data-structures/graph/undirected-graph.js +0 -50
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +5 -92
- package/dist/cjs/data-structures/hash/hash-map.js +27 -111
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +0 -32
- package/dist/cjs/data-structures/heap/heap.js +0 -32
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +5 -88
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +5 -88
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +1 -83
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +2 -84
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +1 -35
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js +1 -35
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +1 -98
- package/dist/cjs/data-structures/queue/deque.js +3 -99
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +1 -54
- package/dist/cjs/data-structures/queue/queue.js +0 -53
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +1 -34
- package/dist/cjs/data-structures/stack/stack.js +1 -34
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/tree/tree.js +0 -1
- package/dist/cjs/data-structures/tree/tree.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +0 -64
- package/dist/cjs/data-structures/trie/trie.js +0 -64
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +8 -0
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.js +6 -0
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/types/utils/utils.d.ts +13 -12
- package/dist/cjs/utils/number.d.ts +13 -0
- package/dist/cjs/utils/number.js +13 -0
- package/dist/cjs/utils/number.js.map +1 -1
- package/dist/cjs/utils/utils.d.ts +125 -3
- package/dist/cjs/utils/utils.js +177 -21
- package/dist/cjs/utils/utils.js.map +1 -1
- package/dist/mjs/data-structures/base/iterable-element-base.d.ts +1 -37
- package/dist/mjs/data-structures/base/iterable-element-base.js +1 -37
- package/dist/mjs/data-structures/base/iterable-entry-base.d.ts +2 -54
- package/dist/mjs/data-structures/base/iterable-entry-base.js +1 -49
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +0 -32
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +9 -41
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +0 -46
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +0 -46
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +82 -147
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +298 -332
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +1 -40
- package/dist/mjs/data-structures/binary-tree/bst.js +12 -44
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +0 -48
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +2 -50
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +0 -32
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +9 -41
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +0 -75
- package/dist/mjs/data-structures/graph/abstract-graph.js +0 -75
- package/dist/mjs/data-structures/graph/directed-graph.d.ts +0 -98
- package/dist/mjs/data-structures/graph/directed-graph.js +0 -98
- package/dist/mjs/data-structures/graph/undirected-graph.d.ts +0 -50
- package/dist/mjs/data-structures/graph/undirected-graph.js +0 -50
- package/dist/mjs/data-structures/hash/hash-map.d.ts +5 -92
- package/dist/mjs/data-structures/hash/hash-map.js +27 -111
- package/dist/mjs/data-structures/heap/heap.d.ts +0 -32
- package/dist/mjs/data-structures/heap/heap.js +0 -32
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +5 -88
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +5 -88
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +1 -83
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +2 -84
- package/dist/mjs/data-structures/linked-list/skip-linked-list.d.ts +1 -35
- package/dist/mjs/data-structures/linked-list/skip-linked-list.js +1 -35
- package/dist/mjs/data-structures/queue/deque.d.ts +1 -98
- package/dist/mjs/data-structures/queue/deque.js +3 -99
- package/dist/mjs/data-structures/queue/queue.d.ts +1 -54
- package/dist/mjs/data-structures/queue/queue.js +0 -53
- package/dist/mjs/data-structures/stack/stack.d.ts +1 -34
- package/dist/mjs/data-structures/stack/stack.js +1 -34
- package/dist/mjs/data-structures/tree/tree.js +0 -1
- package/dist/mjs/data-structures/trie/trie.d.ts +0 -64
- package/dist/mjs/data-structures/trie/trie.js +0 -64
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +8 -0
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.js +5 -1
- package/dist/mjs/types/utils/utils.d.ts +13 -12
- package/dist/mjs/utils/number.d.ts +13 -0
- package/dist/mjs/utils/number.js +13 -0
- package/dist/mjs/utils/utils.d.ts +125 -3
- package/dist/mjs/utils/utils.js +177 -21
- package/dist/umd/data-structure-typed.js +408 -1474
- package/dist/umd/data-structure-typed.min.js +5 -4
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +6 -6
- package/src/data-structures/base/iterable-element-base.ts +2 -42
- package/src/data-structures/base/iterable-entry-base.ts +3 -62
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +8 -48
- package/src/data-structures/binary-tree/avl-tree.ts +0 -57
- package/src/data-structures/binary-tree/binary-tree.ts +329 -358
- package/src/data-structures/binary-tree/bst.ts +11 -54
- package/src/data-structures/binary-tree/rb-tree.ts +2 -62
- package/src/data-structures/binary-tree/tree-multi-map.ts +8 -48
- package/src/data-structures/graph/abstract-graph.ts +0 -92
- package/src/data-structures/graph/directed-graph.ts +0 -122
- package/src/data-structures/graph/undirected-graph.ts +0 -62
- package/src/data-structures/hash/hash-map.ts +29 -133
- package/src/data-structures/heap/heap.ts +0 -40
- package/src/data-structures/linked-list/doubly-linked-list.ts +5 -112
- package/src/data-structures/linked-list/singly-linked-list.ts +2 -104
- package/src/data-structures/linked-list/skip-linked-list.ts +1 -44
- package/src/data-structures/queue/deque.ts +2 -125
- package/src/data-structures/queue/queue.ts +1 -68
- package/src/data-structures/stack/stack.ts +1 -43
- package/src/data-structures/tree/tree.ts +1 -1
- package/src/data-structures/trie/trie.ts +0 -80
- package/src/types/data-structures/binary-tree/binary-tree.ts +8 -1
- package/src/types/utils/utils.ts +17 -15
- package/src/utils/number.ts +13 -0
- package/src/utils/utils.ts +174 -18
- package/test/config.ts +8 -0
- package/test/integration/all-in-one.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +13 -13
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +18 -13
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +471 -64
- package/test/unit/data-structures/binary-tree/bst.test.ts +167 -23
- package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +136 -13
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +18 -13
- package/test/unit/data-structures/graph/directed-graph.test.ts +46 -32
- package/test/unit/data-structures/graph/map-graph.test.ts +24 -2
- package/test/unit/data-structures/graph/undirected-graph.test.ts +24 -24
- package/test/unit/data-structures/hash/hash-map.test.ts +225 -35
- package/test/unit/data-structures/heap/heap.test.ts +47 -39
- package/test/unit/data-structures/heap/min-heap.test.ts +5 -5
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +34 -4
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +32 -0
- package/test/unit/data-structures/matrix/matrix.test.ts +35 -5
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +31 -0
- package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +18 -0
- package/test/unit/data-structures/priority-queue/priority-queue.test.ts +17 -0
- package/test/unit/data-structures/queue/deque.test.ts +288 -47
- package/test/unit/data-structures/queue/queue.test.ts +62 -37
- package/test/unit/data-structures/stack/stack.test.ts +30 -5
- package/test/unit/data-structures/tree/tree.test.ts +58 -0
- package/test/unit/data-structures/trie/trie.test.ts +46 -5
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
deque.
|
|
120
|
-
deque.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
});
|