1def 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 15def 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 45