Commit | Line | Data |
---|---|---|
29ee7e9a JB |
1 | /** |
2 | * Queue | |
3 | */ | |
4 | export class Queue<T> { | |
5 | private items: Record<number, T> | |
6 | private head: number | |
7 | private tail: number | |
8 | ||
9 | constructor () { | |
10 | this.items = {} | |
11 | this.head = 0 | |
12 | this.tail = 0 | |
13 | } | |
14 | ||
15 | enqueue (item: T): number { | |
16 | this.items[this.tail] = item | |
17 | this.tail++ | |
18 | return this.size() | |
19 | } | |
20 | ||
21 | dequeue (): T | undefined { | |
22 | if (this.size() <= 0) return undefined | |
23 | const item = this.items[this.head] | |
24 | // eslint-disable-next-line @typescript-eslint/no-dynamic-delete | |
25 | delete this.items[this.head] | |
26 | this.head++ | |
27 | if (this.head === this.tail) { | |
28 | this.head = 0 | |
29 | this.tail = 0 | |
30 | } | |
31 | return item | |
32 | } | |
33 | ||
34 | size (): number { | |
35 | return this.tail - this.head | |
36 | } | |
37 | } |