#!/usr/bin/env python

__author__ = "bt3"

''' Queue acts as a container for nodes (objects) that are inserted and removed according FIFO'''


class Node(object):
    def __init__(self, value=None, pointer=None):
        self.value = value
        self.pointer = None


class LinkedQueue(object):
    def __init__(self):
        self.head = None
        self.tail = None


    def isEmpty(self):
        return not bool(self.head)


    def dequeue(self):
        if self.head:
            value = self.head.value
            self.head = self.head.pointer
            return value
        else:
            print('Queue is empty, cannot dequeue.')


    def enqueue(self, value):
        node = Node(value)
        if not self.head:
            self.head = node
            self.tail = node
        else:
            if self.tail:
                self.tail.pointer = node
            self.tail = node


    def size(self):
        node = self.head
        num_nodes = 0
        while node:
                num_nodes += 1
                node = node.pointer
        return num_nodes


    def peek(self):
        return self.head.value


    def _print(self):
        node = self.head
        while node:
            print(node.value)
            node = node.pointer




if __name__ == '__main__':
    queue = LinkedQueue()
    print("Is the queue empty? ", queue.isEmpty())
    print("Adding 0 to 10 in the queue...")
    for i in range(10):
        queue.enqueue(i)
    print("Is the queue empty? ", queue.isEmpty())
    queue._print()

    print("Queue size: ", queue.size())
    print("Queue peek : ", queue.peek())
    print("Dequeue...", queue.dequeue())
    print("Queue peek: ", queue.peek())
    queue._print()