class Queue
{
  // initializes the queue
  constructor()
  {
    this.arr = [];
  }

  // uses the array x to fill the queue
  makeFilled(x)
  {
    this.arr = x;
  }

  // Returns true if the queue is empty, and false otherwise.
  isEmpty()
  {
    return (this.arr.length === 0);
  }

  // Enqueues x in the queue (to the end)
  enqueue(x)
  {
    this.arr.push(x);
  }

  // enqueues x to position i
  insert(x, i)
  {
    this.arr.splice(i, 0, x);
  }

  // removes item at index i
  remove(i)
  {
    this.arr.splice(i, 1);
  }

  // Dequeues an item and returns it. If the queue is empty, throws an error
  dequeue()
  {
    // if the queue is empty, throw
    if (this.arr.length === 0)
    {
      throw "Queue empty!";
    }

    // store the item at the front of the queue
    const item = this.arr[0];
    this.remove(0);

    // return the dequeued item
    return item;
  }

  // Returns the item at the front of the queue (without dequeuing it). If the
  // queue is empty then undefined is returned.
  peek()
  {
    return (this.arr.length > 0 ? this.arr[0] : undefined);
  }

  // returns an array of all items in the queue (again, without dequeuing) from the current pos.
  read()
  {
    return this.arr;
  }

  // Deletes all the data, resets to as on construction
  reset()
  {
    this.arr = [];
  }
}

module.exports = Queue;
