from typing import Protocol from abc import abstractmethod from .card import Card class Scheduler(Protocol): """ Schedulers must implement this interface to be usable in a session. """ @abstractmethod def __init__(self, cards: dict[str, Card], state: dict): """ Create a new instance of the scheduler from a dictionary of Cards indexed by ID and a scheduler-specific state as a dict. """ raise NotImplementedError @abstractmethod def practice(self, size: int) -> list[str]: """ Return a list of card IDs of the requested size, if possible. This list is intended for practice. """ raise NotImplementedError @abstractmethod def test(self, size: int) -> list[str]: """ Return a list of card IDs of the requested size, if possible. This list is intended to test the player's knowledge. """ raise NotImplementedError @abstractmethod def update(self, results: dict[str, int]) -> None: """ Takes a dictionary of card IDs and integers, where the integer is 0 if the player failed to guess the other side of the card, of 1 if the player succeeded. """ raise NotImplementedError @abstractmethod def getState(self) -> dict: """ Return the scheduler's state for storage. """ raise NotImplementedError SCHEDULERS = ["brutal"] def getSchedulerClass(name: str) -> Scheduler: """ Returns the class object for the requested scheduler, if one exists. """ match name: case "brutal": from .scheduler_brutal import SchedulerBrutal return SchedulerBrutal case _: raise Exception(f"Unknown scheduler: {name}")