diff options
Diffstat (limited to 'yapymake/util')
-rw-r--r-- | yapymake/util/__init__.py | 1 | ||||
-rw-r--r-- | yapymake/util/peekable_iterator.py | 30 |
2 files changed, 31 insertions, 0 deletions
diff --git a/yapymake/util/__init__.py b/yapymake/util/__init__.py new file mode 100644 index 0000000..b26bbcd --- /dev/null +++ b/yapymake/util/__init__.py @@ -0,0 +1 @@ +from .peekable_iterator import PeekableIterator diff --git a/yapymake/util/peekable_iterator.py b/yapymake/util/peekable_iterator.py new file mode 100644 index 0000000..67bd59d --- /dev/null +++ b/yapymake/util/peekable_iterator.py @@ -0,0 +1,30 @@ +from typing import Iterator, Optional, TypeVar + +__all__ = [ + 'PeekableIterator', +] + +T = TypeVar('T') + +class PeekableIterator(Iterator[T]): + _inner: Iterator[T] + _peeked: Optional[T] + + def __init__(self, inner: Iterator[T]): + self._inner = inner + self._peeked = None + + def __iter__(self) -> Iterator[T]: + return self + + def __next__(self) -> T: + if self._peeked is not None: + result = self._peeked + self._peeked = None + return result + return next(self._inner) + + def peek(self) -> T: + if self._peeked is None: + self._peeked = next(self._inner) + return self._peeked |