aboutsummaryrefslogtreecommitdiff
path: root/yapymake/util
diff options
context:
space:
mode:
Diffstat (limited to 'yapymake/util')
-rw-r--r--yapymake/util/__init__.py1
-rw-r--r--yapymake/util/peekable_iterator.py30
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