private TriggerStateMachine <ScreenState, ScreenEvent, Task> BuildStateMachine() { // Initializing → Created → Destroyed // ↓ ↑ // Resumed // ↓ ↑ // Focused var fsm = new TriggerStateMachine <ScreenState, ScreenEvent, Task>(ScreenState.Initializing); fsm.On(ScreenEvent.Create) .Allow(ScreenState.Initializing, ScreenState.Created, ExecTransition(OnCreate)) .Allow(ScreenState.Created, ScreenState.Created); fsm.On(ScreenEvent.Resume) .Allow(ScreenState.Created, ScreenState.Resumed, ExecTransition(OnResume, ScreenEvent.Resume)) .Allow(ScreenState.Resumed, ScreenState.Resumed); fsm.On(ScreenEvent.Focus) .Allow(ScreenState.Created, ScreenState.Resumed, ExecTransition(OnResume, ScreenEvent.Focus)) .Allow(ScreenState.Resumed, ScreenState.Focused, ExecTransition(OnFocus)) .Allow(ScreenState.Focused, ScreenState.Focused); fsm.On(ScreenEvent.Unfocus) .Allow(ScreenState.Focused, ScreenState.Resumed, ExecTransition(OnFocusLost)) .Allow(ScreenState.Resumed, ScreenState.Resumed); fsm.On(ScreenEvent.Pause) .Allow(ScreenState.Focused, ScreenState.Resumed, ExecTransition(OnFocusLost, ScreenEvent.Pause)) .Allow(ScreenState.Resumed, ScreenState.Created, ExecTransition(OnPause)) .Allow(ScreenState.Created, ScreenState.Created); fsm.On(ScreenEvent.Destroy) .Allow(ScreenState.Focused, ScreenState.Resumed, ExecTransition(OnFocusLost, ScreenEvent.Destroy)) .Allow(ScreenState.Resumed, ScreenState.Created, ExecTransition(OnPause, ScreenEvent.Destroy)) .Allow(ScreenState.Created, ScreenState.Destroyed, ExecTransition(OnDestroy)) .Allow(ScreenState.Destroyed, ScreenState.Destroyed); return(fsm); }
public Builder(TriggerStateMachine <TState, TTrigger, TResult> machine, TTrigger trigger) { _machine = machine; _trigger = trigger; }
protected Route(RouteSettings settings) { _settings = settings; _machine = BuildStateMachine(); }