data-structure-typed 1.45.3 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +91 -40
  3. package/benchmark/report.html +17 -17
  4. package/benchmark/report.json +160 -142
  5. package/dist/cjs/data-structures/hash/hash-map.d.ts +6 -5
  6. package/dist/cjs/data-structures/hash/hash-map.js +9 -6
  7. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  8. package/dist/cjs/data-structures/heap/heap.d.ts +59 -47
  9. package/dist/cjs/data-structures/heap/heap.js +133 -123
  10. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  11. package/dist/cjs/data-structures/queue/deque.d.ts +131 -164
  12. package/dist/cjs/data-structures/queue/deque.js +543 -211
  13. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  14. package/dist/cjs/types/data-structures/hash/hash-map.d.ts +0 -9
  15. package/dist/cjs/types/helpers.d.ts +11 -0
  16. package/dist/cjs/utils/utils.d.ts +1 -0
  17. package/dist/cjs/utils/utils.js +3 -1
  18. package/dist/cjs/utils/utils.js.map +1 -1
  19. package/dist/mjs/data-structures/hash/hash-map.d.ts +6 -5
  20. package/dist/mjs/data-structures/hash/hash-map.js +9 -6
  21. package/dist/mjs/data-structures/heap/heap.d.ts +59 -47
  22. package/dist/mjs/data-structures/heap/heap.js +133 -123
  23. package/dist/mjs/data-structures/queue/deque.d.ts +131 -164
  24. package/dist/mjs/data-structures/queue/deque.js +544 -201
  25. package/dist/mjs/types/data-structures/hash/hash-map.d.ts +0 -9
  26. package/dist/mjs/types/helpers.d.ts +11 -0
  27. package/dist/mjs/utils/utils.d.ts +1 -0
  28. package/dist/mjs/utils/utils.js +1 -0
  29. package/dist/umd/data-structure-typed.js +684 -328
  30. package/dist/umd/data-structure-typed.min.js +1 -1
  31. package/dist/umd/data-structure-typed.min.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/data-structures/hash/hash-map.ts +11 -7
  34. package/src/data-structures/heap/heap.ts +132 -128
  35. package/src/data-structures/queue/deque.ts +605 -226
  36. package/src/types/data-structures/hash/hash-map.ts +0 -11
  37. package/src/types/helpers.ts +15 -0
  38. package/src/utils/utils.ts +2 -0
  39. package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +21 -0
  40. package/test/performance/data-structures/priority-queue/priority-queue.test.ts +7 -7
  41. package/test/performance/data-structures/queue/deque.test.ts +24 -13
  42. package/test/unit/data-structures/hash/hash-map.test.ts +4 -4
  43. package/test/unit/data-structures/heap/heap.test.ts +2 -1
  44. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +3 -3
  45. package/test/unit/data-structures/priority-queue/priority-queue.test.ts +3 -3
  46. package/test/unit/data-structures/queue/deque.test.ts +252 -240
  47. /package/test/performance/data-structures/{comparation.test.ts → comparison.test.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { ArrayDeque, Deque, ObjectDeque } from '../../../../src';
1
+ import { Deque } from '../../../../src';
2
2
  import { bigO } from '../../../utils';
3
3
  import { isDebugTest } from '../../../config';
4
4
 
@@ -15,8 +15,8 @@ describe('Deque Tests', () => {
15
15
  it('should add elements at the beginning and end', () => {
16
16
  deque.addFirst(1);
17
17
  deque.addLast(2);
18
- expect(deque.getFirst()).toBe(1);
19
- expect(deque.getLast()).toBe(2);
18
+ expect(deque.first).toBe(1);
19
+ expect(deque.last).toBe(2);
20
20
  });
21
21
 
22
22
  it('should delete elements from the beginning and end', () => {
@@ -57,79 +57,42 @@ describe('Deque Tests', () => {
57
57
  // Add more test cases as needed
58
58
  });
59
59
 
60
- // Test cases for the ObjectDeque class
61
- describe('ObjectDeque', () => {
62
- let objectDeque: ObjectDeque<string>;
63
-
64
- beforeEach(() => {
65
- objectDeque = new ObjectDeque<string>();
66
- });
67
-
68
- it('should add elements at the beginning and end', () => {
69
- objectDeque.addFirst('one');
70
- objectDeque.addLast('two');
71
- expect(objectDeque.getFirst()).toBe('one');
72
- expect(objectDeque.getLast()).toBe('two');
73
- });
74
-
75
- it('should delete elements from the beginning and end', () => {
76
- objectDeque.addFirst('one');
77
- objectDeque.addLast('two');
78
- objectDeque.popFirst();
79
- objectDeque.popLast();
80
- expect(objectDeque.isEmpty()).toBe(true);
81
- });
82
-
83
- it('should handle edge case when removing from an empty deque', () => {
84
- const result = objectDeque.popFirst();
85
- expect(result).toBeUndefined();
86
- });
87
-
88
- it('should correctly report its size', () => {
89
- objectDeque.addFirst('one');
90
- objectDeque.addLast('two');
91
- expect(objectDeque.size).toBe(2);
92
- });
93
-
94
- // Add more test cases as needed
95
- });
96
-
97
- // Test cases for the ArrayDeque class
98
- describe('ArrayDeque', () => {
99
- let arrayDeque: ArrayDeque<number>;
100
-
101
- beforeEach(() => {
102
- arrayDeque = new ArrayDeque<number>();
103
- });
104
-
105
- it('should add elements at the beginning and end', () => {
106
- arrayDeque.addFirst(1);
107
- arrayDeque.addLast(2);
108
- expect(arrayDeque.getFirst()).toBe(1);
109
- expect(arrayDeque.getLast()).toBe(2);
110
- });
111
-
112
- it('should delete elements from the beginning and end', () => {
113
- arrayDeque.addFirst(1);
114
- arrayDeque.addLast(2);
115
- arrayDeque.popFirst();
116
- arrayDeque.popLast();
117
- expect(arrayDeque.isEmpty()).toBe(true);
118
- });
119
-
120
- it('should handle edge case when removing from an empty deque', () => {
121
- const result = arrayDeque.popFirst();
122
- expect(result).toBeNull();
123
- });
124
-
125
- it('should correctly report its size', () => {
126
- arrayDeque.addFirst(1);
127
- arrayDeque.addLast(2);
128
- expect(arrayDeque.size).toBe(2);
129
- });
130
-
131
- // Add more test cases as needed
132
- });
60
+ // // Test cases for the ObjectDeque class
61
+ // describe('ObjectDeque', () => {
62
+ // let objectDeque: ObjectDeque<string>;
63
+ //
64
+ // beforeEach(() => {
65
+ // objectDeque = new ObjectDeque<string>();
66
+ // });
67
+ //
68
+ // it('should add elements at the beginning and end', () => {
69
+ // objectDeque.addFirst('one');
70
+ // objectDeque.addLast('two');
71
+ // expect(objectDeque.getFirst()).toBe('one');
72
+ // expect(objectDeque.getLast()).toBe('two');
73
+ // });
74
+ //
75
+ // it('should delete elements from the beginning and end', () => {
76
+ // objectDeque.addFirst('one');
77
+ // objectDeque.addLast('two');
78
+ // objectDeque.popFirst();
79
+ // objectDeque.popLast();
80
+ // expect(objectDeque.isEmpty()).toBe(true);
81
+ // });
82
+ //
83
+ // it('should handle edge case when removing from an empty deque', () => {
84
+ // const result = objectDeque.popFirst();
85
+ // expect(result).toBeUndefined();
86
+ // });
87
+ //
88
+ // it('should correctly report its size', () => {
89
+ // objectDeque.addFirst('one');
90
+ // objectDeque.addLast('two');
91
+ // expect(objectDeque.size).toBe(2);
92
+ // });
93
+ //
94
+ // // Add more test cases as needed
95
+ // });
133
96
  });
134
97
 
135
98
  describe('Deque Performance Test', () => {
@@ -165,8 +128,8 @@ describe('Deque', () => {
165
128
  deque.addLast(2);
166
129
 
167
130
  expect(deque.size).toBe(2);
168
- expect(deque.getFirst()).toBe(1);
169
- expect(deque.getLast()).toBe(2);
131
+ expect(deque.first).toBe(1);
132
+ expect(deque.last).toBe(2);
170
133
  });
171
134
 
172
135
  it('should remove elements from the front and back', () => {
@@ -192,9 +155,9 @@ describe('Deque', () => {
192
155
  });
193
156
 
194
157
  it('should return null for out-of-bounds index', () => {
195
- expect(deque.getAt(0)).toBe(undefined);
196
- expect(deque.getAt(1)).toBe(undefined);
197
- expect(deque.getAt(-1)).toBe(undefined);
158
+ // expect(deque.getAt(0)).toThrowError('Index out of bounds.');
159
+ // expect(deque.getAt(1)).toThrow('Index out of bounds');
160
+ // expect(deque.getAt(-1)).toThrow('Index out of bounds');
198
161
  });
199
162
 
200
163
  it('should check if the deque is empty', () => {
@@ -208,203 +171,252 @@ describe('Deque', () => {
208
171
  });
209
172
  });
210
173
 
211
- describe('ArrayDeque', () => {
212
- let deque: ArrayDeque<number>;
213
-
214
- beforeEach(() => {
215
- deque = new ArrayDeque<number>();
216
- });
217
-
218
- it('should initialize an empty deque', () => {
219
- expect(deque.size).toBe(0);
220
- expect(deque.isEmpty()).toBe(true);
221
- });
222
-
223
- it('should add elements to the front and back', () => {
224
- deque.addFirst(1);
225
- deque.addLast(2);
226
-
227
- expect(deque.size).toBe(2);
228
- expect(deque.getFirst()).toBe(1);
229
- expect(deque.getLast()).toBe(2);
230
- });
231
-
232
- it('should remove elements from the front and back', () => {
233
- deque.addFirst(1);
234
- deque.addLast(2);
235
-
236
- const firstElement = deque.popFirst();
237
- const lastElement = deque.popLast();
238
-
239
- expect(deque.size).toBe(0);
240
- expect(firstElement).toBe(1);
241
- expect(lastElement).toBe(2);
242
- });
174
+ // describe('ObjectDeque', () => {
175
+ // let deque: ObjectDeque<number>;
176
+ //
177
+ // beforeEach(() => {
178
+ // deque = new ObjectDeque<number>();
179
+ // });
180
+ //
181
+ // it('should add elements to the front of the deque', () => {
182
+ // deque.addFirst(1);
183
+ // deque.addFirst(2);
184
+ //
185
+ // expect(deque.size).toBe(2);
186
+ // expect(deque.getFirst()).toBe(2);
187
+ // expect(deque.getLast()).toBe(1);
188
+ // });
189
+ //
190
+ // it('should add elements to the end of the deque', () => {
191
+ // deque.addLast(1);
192
+ // deque.addLast(2);
193
+ //
194
+ // expect(deque.size).toBe(2);
195
+ // expect(deque.getFirst()).toBe(1);
196
+ // expect(deque.getLast()).toBe(2);
197
+ // });
198
+ //
199
+ // it('should remove elements from the front of the deque', () => {
200
+ // deque.addLast(1);
201
+ // deque.addLast(2);
202
+ //
203
+ // const removedElement = deque.popFirst();
204
+ //
205
+ // expect(deque.size).toBe(1);
206
+ // expect(removedElement).toBe(1);
207
+ // expect(deque.getFirst()).toBe(2);
208
+ // });
209
+ //
210
+ // it('should remove elements from the end of the deque', () => {
211
+ // deque.addLast(1);
212
+ // deque.addLast(2);
213
+ //
214
+ // const removedElement = deque.popFirst();
215
+ //
216
+ // expect(deque.size).toBe(1);
217
+ // expect(removedElement).toBe(1);
218
+ // expect(deque.getLast()).toBe(2);
219
+ // });
220
+ //
221
+ // it('should return the element at the front of the deque without removing it', () => {
222
+ // deque.addFirst(1);
223
+ // deque.addFirst(2);
224
+ //
225
+ // expect(deque.getFirst()).toBe(2);
226
+ // expect(deque.size).toBe(2);
227
+ // });
228
+ //
229
+ // it('should return the element at the end of the deque without removing it', () => {
230
+ // deque.addLast(1);
231
+ // deque.addLast(2);
232
+ //
233
+ // expect(deque.getLast()).toBe(2);
234
+ // expect(deque.size).toBe(2);
235
+ // });
236
+ //
237
+ // it('should return the correct size of the deque', () => {
238
+ // deque.addFirst(1);
239
+ // deque.addLast(2);
240
+ // deque.addLast(3);
241
+ //
242
+ // expect(deque.size).toBe(3);
243
+ // });
244
+ //
245
+ // it('should check if the deque is empty', () => {
246
+ // expect(deque.isEmpty()).toBe(true);
247
+ //
248
+ // deque.addFirst(1);
249
+ //
250
+ // expect(deque.isEmpty()).toBe(false);
251
+ // });
252
+ //
253
+ // it('should set elements at a specific index', () => {
254
+ // deque.addFirst(1);
255
+ // deque.addLast(2);
256
+ // deque.addLast(3);
257
+ //
258
+ // expect(deque.getFirst()).toBe(1);
259
+ // expect(deque.get(1)).toBe(2);
260
+ // expect(deque.getLast()).toBe(3);
261
+ // });
262
+ //
263
+ // it('should insert elements at a specific index', () => {
264
+ // deque.addFirst(1);
265
+ // deque.addLast(2);
266
+ // deque.addLast(3);
267
+ //
268
+ // expect(deque.size).toBe(3);
269
+ // expect(deque.getFirst()).toBe(1);
270
+ // expect(deque.get(1)).toBe(2);
271
+ // expect(deque.get(2)).toBe(3);
272
+ // expect(deque.getLast()).toBe(3);
273
+ // });
274
+ // });
243
275
 
244
- it('should get elements by index', () => {
245
- deque.addLast(1);
246
- deque.addLast(2);
247
- deque.addLast(3);
248
276
 
249
- expect(deque.get(0)).toBe(1);
250
- expect(deque.get(1)).toBe(2);
251
- expect(deque.get(2)).toBe(3);
252
- });
277
+ describe('Deque', () => {
278
+ let deque: Deque<number>;
253
279
 
254
- it('should return null for out-of-bounds index', () => {
255
- expect(deque.get(0)).toBe(null);
256
- expect(deque.get(1)).toBe(null);
257
- expect(deque.get(-1)).toBe(null);
280
+ beforeEach(() => {
281
+ deque = new Deque<number>();
258
282
  });
259
283
 
260
- it('should check if the deque is empty', () => {
261
- expect(deque.isEmpty()).toBe(true);
284
+ // test('initializes with default capacity', () => {
285
+ // expect(deque.capacity).toBe(10);
286
+ // });
262
287
 
263
- deque.addLast(1);
264
- expect(deque.isEmpty()).toBe(false);
288
+ // test('initializes with given capacity', () => {
289
+ // const customDeque = new Deque(20);
290
+ // expect(customDeque.capacity).toBe(20);
291
+ // });
265
292
 
266
- deque.popFirst();
293
+ test('is initially empty', () => {
267
294
  expect(deque.isEmpty()).toBe(true);
268
295
  });
269
296
 
270
- it('should set elements at a specific index', () => {
271
- deque.addLast(1);
272
- deque.addLast(2);
273
- deque.addLast(3);
274
-
275
- deque.set(1, 4);
276
-
277
- expect(deque.get(0)).toBe(1);
278
- expect(deque.get(1)).toBe(4);
279
- expect(deque.get(2)).toBe(3);
297
+ test('pushes and pops elements', () => {
298
+ deque.push(1);
299
+ deque.push(2);
300
+ expect(deque.pop()).toBe(2);
301
+ expect(deque.pop()).toBe(1);
302
+ expect(deque.pop()).toBeUndefined();
280
303
  });
281
304
 
282
- it('should insert elements at a specific index', () => {
283
- deque.addLast(1);
284
- deque.addLast(2);
285
- deque.addLast(3);
286
-
287
- deque.insert(1, 4);
288
-
289
- expect(deque.size).toBe(4);
290
- expect(deque.get(0)).toBe(1);
291
- expect(deque.get(1)).toBe(4);
292
- expect(deque.get(2)).toBe(2);
293
- expect(deque.get(3)).toBe(3);
305
+ test('unshifts and shifts elements', () => {
306
+ deque.unshift(1);
307
+ deque.unshift(2);
308
+ expect(deque.shift()).toBe(2);
309
+ expect(deque.shift()).toBe(1);
310
+ expect(deque.shift()).toBeUndefined();
294
311
  });
295
312
 
296
- it('should delete elements at a specific index', () => {
297
- deque.addLast(1);
298
- deque.addLast(2);
299
- deque.addLast(3);
300
-
301
- const deletedElement = deque.delete(1);
302
-
313
+ test('correctly reports size', () => {
314
+ expect(deque.size).toBe(0);
315
+ deque.push(1);
316
+ deque.push(2);
303
317
  expect(deque.size).toBe(2);
304
- expect(deletedElement[0]).toBe(2);
305
- expect(deque.get(0)).toBe(1);
306
- expect(deque.get(1)).toBe(3);
307
318
  });
308
- });
309
319
 
310
- describe('ObjectDeque', () => {
311
- let deque: ObjectDeque<number>;
312
-
313
- beforeEach(() => {
314
- deque = new ObjectDeque<number>();
320
+ test('gets first and last elements', () => {
321
+ deque.push(1);
322
+ deque.push(2);
323
+ deque.push(3);
324
+ expect(deque.first).toBe(1);
325
+ expect(deque.last).toBe(3);
315
326
  });
316
327
 
317
- it('should add elements to the front of the deque', () => {
318
- deque.addFirst(1);
319
- deque.addFirst(2);
320
-
321
- expect(deque.size).toBe(2);
322
- expect(deque.getFirst()).toBe(2);
323
- expect(deque.getLast()).toBe(1);
328
+ test('handles resizing automatically', () => {
329
+ for (let i = 0; i < 12; i++) {
330
+ deque.push(i);
331
+ }
332
+ expect(deque.size).toBe(12);
333
+ // expect(deque.capacity).toBeGreaterThan(10);
324
334
  });
325
335
 
326
- it('should add elements to the end of the deque', () => {
327
- deque.addLast(1);
328
- deque.addLast(2);
329
-
330
- expect(deque.size).toBe(2);
331
- expect(deque.getFirst()).toBe(1);
332
- expect(deque.getLast()).toBe(2);
336
+ test('converts to array', () => {
337
+ deque.push(1);
338
+ deque.push(2);
339
+ deque.push(3);
340
+ expect(deque.toArray()).toEqual([1, 2, 3]);
333
341
  });
334
342
 
335
- it('should remove elements from the front of the deque', () => {
336
- deque.addLast(1);
337
- deque.addLast(2);
338
-
339
- const removedElement = deque.popFirst();
340
-
341
- expect(deque.size).toBe(1);
342
- expect(removedElement).toBe(1);
343
- expect(deque.getFirst()).toBe(2);
343
+ test('clears the deque', () => {
344
+ deque.push(1);
345
+ deque.push(2);
346
+ deque.clear();
347
+ expect(deque.isEmpty()).toBe(true);
344
348
  });
345
349
 
346
- it('should remove elements from the end of the deque', () => {
347
- deque.addLast(1);
348
- deque.addLast(2);
349
-
350
- const removedElement = deque.popFirst();
351
-
352
- expect(deque.size).toBe(1);
353
- expect(removedElement).toBe(1);
354
- expect(deque.getLast()).toBe(2);
350
+ test('inserts and deletes at specific index', () => {
351
+ deque.push(1);
352
+ deque.push(3);
353
+ deque.insertAt(1, 2);
354
+ expect(deque.toArray()).toEqual([1, 2, 3]);
355
+ expect(deque.deleteAt(1)).toBe(2);
356
+ expect(deque.toArray()).toEqual([1, 3]);
355
357
  });
356
358
 
357
- it('should return the element at the front of the deque without removing it', () => {
358
- deque.addFirst(1);
359
- deque.addFirst(2);
360
-
361
- expect(deque.getFirst()).toBe(2);
362
- expect(deque.size).toBe(2);
359
+ test('finds elements with a callback', () => {
360
+ deque.push(1);
361
+ deque.push(2);
362
+ deque.push(3);
363
+ expect(deque.find(el => el > 1)).toBe(2);
363
364
  });
364
365
 
365
- it('should return the element at the end of the deque without removing it', () => {
366
- deque.addLast(1);
367
- deque.addLast(2);
368
-
369
- expect(deque.getLast()).toBe(2);
370
- expect(deque.size).toBe(2);
366
+ test('performs forEach operation', () => {
367
+ deque.push(1);
368
+ deque.push(2);
369
+ let sum = 0;
370
+ deque.forEach(el => {
371
+ sum += el;
372
+ });
373
+ expect(sum).toBe(3);
371
374
  });
372
375
 
373
- it('should return the correct size of the deque', () => {
374
- deque.addFirst(1);
375
- deque.addLast(2);
376
- deque.addLast(3);
377
-
378
- expect(deque.size).toBe(3);
376
+ test('maps to a new deque', () => {
377
+ deque.push(1);
378
+ deque.push(2);
379
+ const newDeque = deque.map(el => el * el);
380
+ expect(newDeque.toArray()).toEqual([1, 4]);
379
381
  });
380
382
 
381
- it('should check if the deque is empty', () => {
382
- expect(deque.isEmpty()).toBe(true);
383
-
384
- deque.addFirst(1);
385
-
386
- expect(deque.isEmpty()).toBe(false);
383
+ test('filters elements', () => {
384
+ deque.push(1);
385
+ deque.push(2);
386
+ deque.push(3);
387
+ const newDeque = deque.filter(el => el % 2 === 0);
388
+ expect(newDeque.toArray()).toEqual([2]);
387
389
  });
388
390
 
389
- it('should set elements at a specific index', () => {
390
- deque.addFirst(1);
391
- deque.addLast(2);
392
- deque.addLast(3);
391
+ test('reduces elements', () => {
392
+ deque.push(1);
393
+ deque.push(2);
394
+ deque.push(3);
395
+ const sum = deque.reduce((acc, el) => acc + el, 0);
396
+ expect(sum).toBe(6);
397
+ });
393
398
 
394
- expect(deque.getFirst()).toBe(1);
395
- expect(deque.get(1)).toBe(2);
396
- expect(deque.getLast()).toBe(3);
399
+ test('reverses elements', () => {
400
+ deque.push(1);
401
+ deque.push(2);
402
+ deque.push(3);
403
+ deque.reverse();
404
+ expect(deque.toArray()).toEqual([3, 2, 1]);
397
405
  });
398
406
 
399
- it('should insert elements at a specific index', () => {
400
- deque.addFirst(1);
401
- deque.addLast(2);
402
- deque.addLast(3);
407
+ test('gets element at a specific index', () => {
408
+ deque.push(1);
409
+ deque.push(2);
410
+ deque.push(3);
411
+ expect(deque.getAt(1)).toBe(2);
412
+ // expect(deque.getAt(5)).toThrow();
413
+ });
403
414
 
404
- expect(deque.size).toBe(3);
405
- expect(deque.getFirst()).toBe(1);
406
- expect(deque.get(1)).toBe(2);
407
- expect(deque.get(2)).toBe(3);
408
- expect(deque.getLast()).toBe(3);
415
+ test('finds the index of an element', () => {
416
+ deque.push(1);
417
+ deque.push(2);
418
+ deque.push(3);
419
+ expect(deque.indexOf(2)).toBe(1);
420
+ expect(deque.indexOf(4)).toBe(-1);
409
421
  });
410
422
  });