diff options
author | Melody Horn <melody@boringcactus.com> | 2021-03-25 17:24:53 -0600 |
---|---|---|
committer | Melody Horn <melody@boringcactus.com> | 2021-03-25 17:24:53 -0600 |
commit | cdb84fd4bd0ae86d3a84ad81f299a4116ceb2fae (patch) | |
tree | 4c92c3f97bbc9a3284c3a53582d2b52334dc57c9 /yapymake/util | |
download | yapymake-cdb84fd4bd0ae86d3a84ad81f299a4116ceb2fae.tar.gz yapymake-cdb84fd4bd0ae86d3a84ad81f299a4116ceb2fae.zip |
catch up with rust version, mostly
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 |