• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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