Source code for nqs_sdk.utils.pickable_generator
from abc import ABC, abstractmethod
from typing import Any, Callable, Generic, Iterator, Tuple, TypeVar
T = TypeVar("T")
[docs]
class PickableGenerator(ABC, Iterator, Generic[T]):
@abstractmethod
def __iter__(self) -> Iterator[T]:
pass
@abstractmethod
def __next__(self) -> T:
pass
[docs]
class NoneGenerator(PickableGenerator):
[docs]
def __init__(self) -> None:
pass
def __iter__(self) -> Iterator[None]:
return self
def __next__(self) -> None:
return None
[docs]
class StatefulGenerator(PickableGenerator[T]):
[docs]
def __init__(self, state: Any, update: Callable[[Any], Tuple[Any, T]]) -> None:
self._state = state
self._update = update
self._running = True
def __iter__(self) -> Iterator[T]:
return self
def __next__(self) -> T:
# once stopped StatefulGenerator manages next calls to raise StopIterator by itself
if self._running:
try:
# _update can raise StopIteration if necessary
self._state, current = self._update(self._state)
return current
except StopIteration:
self._running = False
raise
else:
raise StopIteration