Source code for pyterrier_alpha.utils

"""Module that provides utility functions."""

from typing import Any, Iterable, Iterator, Union

_NO_BUFFER = object()

class PeekableIter:
    """An iterator that allows peeking at the next element."""
    def __init__(self, base: Union[Iterator, Iterable]):
        """Create a PeekableIter from an iterator or iterable."""
        self.base = iter(base)
        self._buffer = _NO_BUFFER

    def __getattr__(self, attr: str):
        return getattr(self.base, attr)

    def __next__(self):
        if self._buffer != _NO_BUFFER:
            n = self._buffer
            self._buffer = _NO_BUFFER
            return n
        return next(self.base)

    def __iter__(self):
        return self

    def peek(self) -> Any:
        """Return the next element without consuming it."""
        if self._buffer == _NO_BUFFER:
            self._buffer = next(self.base)
        return self._buffer


[docs] def peekable(it: Union[Iterator, Iterable]) -> PeekableIter: """Create a PeekableIter from an iterator or iterable.""" return PeekableIter(it)