1 def peek_and_iter(items):
2 if not items:
3 return None, None
4 items = iter(items)
5 try:
6 peeked = next(items)
7 except StopIteration:
8 return None, None
9 def chain():
10 yield peeked
11 yield from items
12 return chain(), peeked
13
14
15 def iter_many(items, onempty=None):
16 if not items:
17 if onempty is None:
18 return
19 if not callable(onempty):
20 raise onEmpty
21 items = onempty(items)
22 yield from iter_many(items, onempty=None)
23 return
24 items = iter(items)
25 try:
26 first = next(items)
27 except StopIteration:
28 if onempty is None:
29 return
30 if not callable(onempty):
31 raise onEmpty
32 items = onempty(items)
33 yield from iter_many(items, onempty=None)
34 else:
35 try:
36 second = next(items)
37 except StopIteration:
38 yield first, False
39 return
40 else:
41 yield first, True
42 yield second, True
43 for item in items:
44 yield item, True