from abc import abstractmethod from logging import Logger from typing import Any, Final, Iterable, Iterator, Protocol, Sequence, TypeVar, overload _T = TypeVar("_T") class ProgressHandler(Protocol): @overload def wrap(self, values: Sequence[_T]) -> Iterator[_T]: ... @overload def wrap(self, values: Iterable[_T], total: int) -> Iterator[_T]: ... class BaseSolver: def __init__( self, logger: Logger, verbose: bool, year: int, day: int, progress: ProgressHandler, outputs: bool = False, ): self.logger: Final = logger self.verbose: Final = verbose self.year: Final = year self.day: Final = day self.progress: Final = progress self.outputs = outputs @abstractmethod def solve(self, input: str) -> Iterator[Any] | None: ...