mirror of https://github.com/python/cpython
49 lines
1.1 KiB
Python
49 lines
1.1 KiB
Python
|
|
_NOT_SET = object()
|
|
|
|
|
|
def peek_and_iter(items):
|
|
if not items:
|
|
return None, None
|
|
items = iter(items)
|
|
try:
|
|
peeked = next(items)
|
|
except StopIteration:
|
|
return None, None
|
|
def chain():
|
|
yield peeked
|
|
yield from items
|
|
return chain(), peeked
|
|
|
|
|
|
def iter_many(items, onempty=None):
|
|
if not items:
|
|
if onempty is None:
|
|
return
|
|
if not callable(onempty):
|
|
raise onEmpty
|
|
items = onempty(items)
|
|
yield from iter_many(items, onempty=None)
|
|
return
|
|
items = iter(items)
|
|
try:
|
|
first = next(items)
|
|
except StopIteration:
|
|
if onempty is None:
|
|
return
|
|
if not callable(onempty):
|
|
raise onEmpty
|
|
items = onempty(items)
|
|
yield from iter_many(items, onempty=None)
|
|
else:
|
|
try:
|
|
second = next(items)
|
|
except StopIteration:
|
|
yield first, False
|
|
return
|
|
else:
|
|
yield first, True
|
|
yield second, True
|
|
for item in items:
|
|
yield item, True
|