| 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; |