class Queue(object):
    def __init__(self):
        self.__q = []
        self.__waitingFutures = []

    def put(self, item):
        try:
            future = self.__waitingFutures.pop(0)
        except IndexError:
            self.__q.append(item)
        else:
            future.complete(item, None)
        
    def get(self):
        try:
            item = self.__q.pop(0)
        except IndexError:
            f = Future()
            self.__waitingFutures.append(f)
            return f
        else:
            return CompletedFuture(item)

