Skip to content

Commit 2fb3682

Browse files
committed
✨ Add pop/shift methods for SlidingTaskMap
1 parent 76d6312 commit 2fb3682

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

src/SlidingTaskMap.ts

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class SlidingTaskMap<K, V extends Deletable> extends TaskMap<K, V> {
1717
}
1818

1919
if (this.size + 1 > this.windowSize) {
20-
this.delete(this.keysByTime[0]);
20+
this.shift();
2121
}
2222
this.keysByTime.push(key);
2323
return super.set(key, value);
@@ -32,10 +32,28 @@ class SlidingTaskMap<K, V extends Deletable> extends TaskMap<K, V> {
3232
return didDelete;
3333
}
3434

35-
clear() {
35+
clear(): void {
3636
super.clear();
3737
this.keysByTime.length = 0;
3838
}
39+
40+
pop(): boolean {
41+
if (this.keysByTime.length === 0) {
42+
return false;
43+
}
44+
45+
const key = this.keysByTime[this.keysByTime.length - 1];
46+
return this.delete(key);
47+
}
48+
49+
shift(): boolean {
50+
if (this.keysByTime.length === 0) {
51+
return false;
52+
}
53+
54+
const key = this.keysByTime[0];
55+
return this.delete(key);
56+
}
3957
}
4058

4159
export default SlidingTaskMap;

test/SlidingTaskMap.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,35 @@ describe('SlidingTaskMap', () => {
5050
// @ts-expect-error simulating no type safety env
5151
expect(() => new SlidingTaskMap('x')).toThrow();
5252
});
53+
54+
it('Removes element from front (shift)', async () => {
55+
const map = new SlidingTaskMap<string, Task<number>>(5);
56+
expect(map.pop()).toBe(false);
57+
expect(map.shift()).toBe(false);
58+
59+
const tasks = [new Task<number>(), new Task<number>(), new Task<number>()];
60+
61+
map.set('1', tasks[0]);
62+
map.set('2', tasks[1]);
63+
map.set('3', tasks[2]);
64+
65+
expect(map.size).toBe(3);
66+
67+
expect(map.pop()).toBe(true);
68+
expect(map.size).toBe(2);
69+
expect(map.has('1')).toBe(true);
70+
expect(map.has('2')).toBe(true);
71+
expect(map.has('3')).toBe(false);
72+
73+
expect(map.shift()).toBe(true);
74+
expect(map.size).toBe(1);
75+
expect(map.has('1')).toBe(false);
76+
expect(map.has('2')).toBe(true);
77+
expect(map.has('3')).toBe(false);
78+
79+
expect(map.pop()).toBe(true);
80+
expect(map.size).toBe(0);
81+
expect(map.has('1')).toBe(false);
82+
expect(map.shift()).toBe(false);
83+
});
5384
});

0 commit comments

Comments
 (0)