/** * Data structure allowing for the insertion and removal of * elements in a FIFO manner in `O(1)` time. * @author MindfulMinun * @since 2022-10-22 */ export class Queue implements Iterable { #elements: Record #head: number #tail: number constructor(initials?: Iterable) { this.#elements = {} this.#head = 0 this.#tail = 0 if (!initials) return for (const el of initials) this.push(el) } /** Add an element to the queue */ push(element: T): void { this.#elements[this.#tail++] = element } /** Remove an element from the queue and return it. */ pop(): T | undefined { if (this.length === 0) return undefined const el = this.#elements[this.#head] delete this.#elements[this.#head++] return el } /** Preview the next element in the queue without removing it. */ peek(): T | undefined { if (this.length === 0) return undefined return this.#elements[this.#head] } /** The number of elements remaining in the queue */ get length(): number { return this.#tail - this.#head } *[Symbol.iterator](): Generator, void, unknown> { while (this.length !== 0) yield this.pop()! } }