forked from CodeMouse92/DeadSimplePython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcafe_queue_abc.py
More file actions
88 lines (60 loc) · 2.02 KB
/
cafe_queue_abc.py
File metadata and controls
88 lines (60 loc) · 2.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from collections.abc import Collection, Iterator
from abc import abstractmethod
class CustomerQueue(Collection):
@abstractmethod
def add_customer(self, customer): pass
@property
@abstractmethod
def first(self): pass
class CafeQueue(CustomerQueue):
def __init__(self):
self._queue = []
self._orders = {}
self._togo = {}
def __iter__(self):
return Iterator_CafeQueue(self)
def __len__(self):
return len(self._queue)
def __contains__(self, customer):
return (customer in self._queue)
def add_customer(self, customer, *orders, to_go=True):
self._queue.append(customer)
self._orders[customer] = tuple(orders)
self._togo[customer] = to_go
@property
def first(self):
return self._queue[0]
class Iterator_CafeQueue(Iterator):
def __init__(self, iterable):
self._iterable = iterable
self._position = 0
def __next__(self):
if self._position >= len(self._iterable):
raise StopIteration
customer = self._iterable._queue[self._position]
orders = self._iterable._orders[customer]
togo = self._iterable._togo[customer]
self._position += 1
return (customer, orders, togo)
def __iter__(self):
return self
def serve_customers(queue):
if not isinstance(queue, CustomerQueue):
raise TypeError("serve_next() requires a customer queue.")
if not len(queue):
print("Queue is empty.")
return
def brew(order):
print(f"(Making {order}...)")
for customer, orders, to_go in queue:
for order in orders: brew(order)
if to_go:
print(f"Order for {customer}!")
else:
print(f"(Takes order to {customer})")
queue = CafeQueue()
queue.add_customer('Raquel', 'double macchiato', to_go=False)
queue.add_customer('Naomi', 'large mocha, skim')
queue.add_customer('Anmol', 'mango lassi')
print(f"The first person in line is {queue.first}.")
serve_customers(queue)