# Copyright (C) 2018 Avatao.com Innovative Learning Kft. # All Rights Reserved. See LICENSE file for details. from typing import List from transitions import Machine from tfw.mixins import CallbackMixin class FSMBase(CallbackMixin): """ A general FSM base class you can inherit from to track user progress. See linear_fsm.py for an example use-case. TFW the transitions library for state machines, please refer to their documentation for more information on creating your own machines: https://github.com/pytransitions/transitions """ states, transitions = [], [] def __init__(self, initial: str = None, accepted_states: List[str] = None): CallbackMixin.__init__(self) self.accepted_states = accepted_states or [self.states[-1]] self.machine = Machine(model=self, states=self.states, transitions=self.transitions, initial=initial or self.states[0], send_event=True, ignore_invalid_triggers=True, after_state_change='execute_callbacks') def execute_callbacks(self, event_data): self._execute_callbacks(event_data.kwargs) def is_solved(self): return self.state in self.accepted_states # pylint: disable=no-member