"""Module that provides utility functions."""fromtypingimportAny,Iterable,Iterator,Union_NO_BUFFER=object()classPeekableIter:"""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_BUFFERdef__getattr__(self,attr:str):returngetattr(self.base,attr)def__next__(self):ifself._buffer!=_NO_BUFFER:n=self._bufferself._buffer=_NO_BUFFERreturnnreturnnext(self.base)def__iter__(self):returnselfdefpeek(self)->Any:"""Return the next element without consuming it."""ifself._buffer==_NO_BUFFER:self._buffer=next(self.base)returnself._buffer
[docs]defpeekable(it:Union[Iterator,Iterable])->PeekableIter:"""Create a PeekableIter from an iterator or iterable."""returnPeekableIter(it)