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