pytorch/torch/_dynamo/polyfills/itertools.py
2024-08-20 19:48:57 +00:00

32 lines
826 B
Python

"""
Python polyfills for itertools
"""
import itertools
from typing import Iterable, Iterator, Tuple, TypeVar
from ..decorators import substitute_in_graph
_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))