import Node
import LinkedQueue

class LinkedDeque(LinkedQueue.LinkedQueue):

    def __init__(self): # initialize
        super().__init__()

    def __str__(self): # string value of the Deque
        return(super().__str__())

    def add_front(self, item): # adds item to the front of the Deque
        node = Node.Node(item)
        if self.is_empty():
            self.top = node
            self.rear = node
            self.length += 1
        else:
            prevTop = self.top
            self.top = node
            self.top.set_next(prevTop)
            self.length += 1

    def add_rear(self, item): # adds item to the end of the deque
        super().enqueue(item)

    def remove_front(self): # removes and returns the front
        return(super().dequeue())

    def remove_rear(self): # removes and returns the rear
        checknode = self.top
        previousNode = checknode
        if checknode.get_next() == None:
            self.rear = None
            self.top = None
            self.length = self.length - 1
        else:
            while(checknode.get_next() is not None):
                previousNode = checknode
                checknode = checknode.get_next()
            self.length = self.length - 1
            self.rear = previousNode
            previousNode.set_next(None)
        return checknode.get_data()

    def get_front(self): # returns but does not remove the front
        return(super().first())

    def get_rear(self): # returns but does not remove the rear
        return(self.rear.get_data())

    def size(self): # returns the size of the Deque object
        return(super().size())

    def is_empty(self): # check to see if Deque object is empty
        return(super().is_empty())