# Title: Queue
# Heading: Python Program to Implement a Queue
# Level: beginner
# Tags: queue, deque, fifo, first in first out
# Time: O(1)
# Space: O(n)
# About: A first-in, first-out print queue built on collections.deque: jobs join at the back, leave from the front, and peek shows the next one.

from collections import deque


class Queue:
    """A first-in, first-out queue."""

    def __init__(self):
        self.items = deque()

    def enqueue(self, item):
        """Add item at the back."""
        self.items.append(item)

    def dequeue(self):
        """Remove and return the item at the front."""
        return self.items.popleft()

    def peek(self):
        """The item at the front, without removing it."""
        return self.items[0]


printer = Queue()
for job in ["report.pdf", "photo.png", "notes.txt"]:
    printer.enqueue(job)
print("Printing:", printer.dequeue())
print("Next up:", printer.peek())
print("Waiting:", list(printer.items))
