feat: use O(1) queue implementation
[poolifier.git] / src / queue.ts
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 }