export default class Queue {
    constructor() {
        this._firstNode = null;
        this._lastNode = null;
    }

    dequeue() {
        if (!this._firstNode) {
            return this._firstNode;
        }

        const payload = this._firstNode.payload;

        this._firstNode = this._firstNode.next;

        return payload;
    }

    enqueue(item) {
        const newNode = {
            payload: item,
            next: null
        };

        if (this._firstNode === null) {
            this._firstNode = newNode;
            this._lastNode = newNode;

        } else {
            this._lastNode.next = newNode;
            this._lastNode = newNode;
        }
    }

    clear() {
        this._firstNode = null;
        this._lastNode = null;
    }

    top() {
        if (!this._firstNode) {
            return this._firstNode;
        }

        return this._firstNode.payload;
    }

    isEmpty() {
        return !this._firstNode;
    }
}