From cdb84fd4bd0ae86d3a84ad81f299a4116ceb2fae Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Thu, 25 Mar 2021 17:24:53 -0600 Subject: catch up with rust version, mostly --- yapymake/util/__init__.py | 1 + yapymake/util/peekable_iterator.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 yapymake/util/__init__.py create mode 100644 yapymake/util/peekable_iterator.py (limited to 'yapymake/util') 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 -- cgit v1.2.3