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