class Node { /// value; /// next; constructor(value) { this.value = value; // TODO: Remove this when targeting Node.js 12. this.next = undefined; } } class Queue { // TODO: Use private class fields when targeting Node.js 12. // #_head; // #_tail; // #_size; constructor() { this.clear(); } enqueue(value) { const node = new Node(value); if (this._head) { this._tail.next = node; this._tail = node; } else { this._head = node; this._tail = node; } this._size++; } dequeue() { const current = this._head; if (!current) { return; } this._head = this._head.next; this._size--; return current.value; } clear() { this._head = undefined; this._tail = undefined; this._size = 0; } get size() { return this._size; } * [Symbol.iterator]() { let current = this._head; while (current) { yield current.value; current = current.next; } } } module.exports = Queue;