37 lines
951 B
Python
37 lines
951 B
Python
from typing import Iterable, Iterator
|
|
|
|
from .provider import EofException, Provider
|
|
|
|
|
|
class CharProvider(Provider[str]):
|
|
data: Iterator[str]
|
|
|
|
def __init__(self, data: Iterator[str] | Iterable[str]) -> None:
|
|
if isinstance(data, Iterator):
|
|
self.data = data
|
|
else:
|
|
self.data = iter(data)
|
|
self.peeked: list[str] = []
|
|
|
|
def _ensure_next(self) -> str:
|
|
if not self.peeked:
|
|
try:
|
|
self.peeked = [next(self.data)]
|
|
except StopIteration:
|
|
raise EofException() from None
|
|
return self.peeked[0]
|
|
|
|
def peek(self) -> str:
|
|
return self._ensure_next()
|
|
|
|
def get(self) -> str:
|
|
result = self._ensure_next()
|
|
self.peeked = self.peeked[1:]
|
|
return result
|
|
|
|
def finished(self) -> bool:
|
|
try:
|
|
self._ensure_next()
|
|
return False
|
|
except EofException:
|
|
return True
|