""" Python polyfills for itertools """ import itertools from typing import Iterable, Iterator, Tuple, TypeVar from ..decorators import substitute_in_graph __all__ = ["tee"] _T = TypeVar("_T") # Reference: https://docs.python.org/3/library/itertools.html#itertools.tee @substitute_in_graph(itertools.tee) def tee(iterable: Iterable[_T], n: int = 2, /) -> Tuple[Iterator[_T], ...]: iterator = iter(iterable) shared_link = [None, None] def _tee(link) -> Iterator[_T]: # type: ignore[no-untyped-def] try: while True: if link[1] is None: link[0] = next(iterator) link[1] = [None, None] value, link = link yield value except StopIteration: return return tuple(_tee(shared_link) for _ in range(n))