""" Two queue implementations """
from linked_list import LinkedList


class PLQueue:
    """ A queue implemented with an underlying Python list """

    def __init__(self):
        """ Initialize a new empty queue """
        self._queue = []

    def add(self, item):
        """ Add item to the end of this queue """
        self._queue.append(item)

    def remove(self):
        """ Remove and return the item at the beginning of this queue """
        return self._queue.pop(0)

    def is_empty(self):
        """ Return whether or not this queue is empty """
        return len(self._queue) == 0


class LLQueue:
    """ A queue implemented with an underlying Linked list """

    def __init__(self):
        """ Initialize a new empty queue """
        self._queue = LinkedList()

    def add(self, item):
        """ Add item to the end of this queue """
        self._queue.append(item)

    def remove(self):
        """ Remove the item at the beginning of this queue """
        return self._queue.delete_front()

    def is_empty(self):
        """ Return whether or not this queue is empty """
        return self._queue.size == 0
