from abc import ABC, abstractmethod class Simulation(ABC): @abstractmethod def start(self): "Start the simulated object." pass @abstractmethod def tick(self) -> bool: """ Simulate one clock tick. Returns: bool: True if the simulation could advance one clock tick, or False if the object is expired. """ pass @abstractmethod def get_uses(self): """ Return the uses of the simulated object. These are verb strings which are passed to the `use()` method. Returns: tuple: A dict of key-value pairs, where the keys are strings of verbs to be passed to `use`, and the values are strings explaining what the verb does in English. """ @abstractmethod def use(self, *args, **kwargs): """ Use the simulated object. Args: args (tuple): A tuple of verbs to be used on the object. kwargs (dict): A dictionary of key-value pairs of arguments to the verb(s). Returns: True if the action succeeded, False if the action did not succeed and the object needs to be expired. """ pass @abstractmethod def stop(self): "Stop the simulated object." pass