const { LinkedList: SinglyLinkedLists } = require('../LinkedList');

class Queue extends SinglyLinkedLists {
  constructor() {
    super();
    this.NotAllowed = 'Not Allowed';
  }

  enqueue(data) {
    return this.addAtEnd(data);
  }

  dequeue() {
    const node = this.removeFromBeginning();
    return node ? node.data : node;
  }

  peek() {
    const node = this.getFirst();
    return node ? node.data : node;
  }

  length() {
    return this.size;
  }

  destroy() {
    this.delete();
  }

  /** Override and throw error for other LL methods */
  addAtBeginning() {
    throw new Error(this.NotAllowed);
  }

  addAt() {
    throw new Error(this.NotAllowed);
  }

  removeFromEnd() {
    throw new Error(this.NotAllowed);
  }

  getLast() {
    throw new Error(this.NotAllowed);
  }

  getAt() {
    throw new Error(this.NotAllowed);
  }

  removeAt() {
    throw new Error(this.NotAllowed);
  }
}

module.exports = Queue;