69 lines
		
	
	
		
			949 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			949 B
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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;
 |