protected RawStateMachineBase(TState initialState, Configuration <TState, TTrigger> configuration) { Representations = configuration.Representations; CurrentStateRepresentation = StateConfigurationHelper.FindStateRepresentation( initialState, Representations); if (CurrentStateRepresentation == null) { ExceptionHelper.ThrowInvalidState(initialState); } diagnostics = new RawStateMachineDiagnostics <TState, TTrigger>(this); }
public void Fire(TTrigger trigger) { lock (syncRoot) { if (!IsEnabled) { return; } var triggerRep = StateConfigurationHelper <TState, TTrigger> .FindTriggerRepresentation(trigger, CurrentStateRepresentation); if (triggerRep == null) { HandleInvalidTrigger(trigger); return; } var previousState = CurrentState; var predicate = triggerRep.ConditionalTriggerPredicate; if (predicate != null) { if (!predicate()) { HandleInvalidTrigger(trigger); return; } } // Handle ignored trigger if (triggerRep.NextStateRepresentation == null) { return; } // Catch invalid paramters before execution. Action triggerAction = null; try { triggerAction = (Action)triggerRep.OnTriggerAction; } catch (InvalidCastException) { InvalidTriggerParameterException <TTrigger> .Throw(trigger); return; } // Current exit var currentExit = CurrentStateRepresentation.OnExitAction; ExecuteAction(currentExit); // Trigger entry ExecuteAction(triggerAction); var nextStateRep = triggerRep.NextStateRepresentation; // Next entry var nextEntry = nextStateRep.OnEntryAction; ExecuteAction(nextEntry); CurrentStateRepresentation = nextStateRep; // Raise state change event var stateChangedHandler = StateChanged; if (stateChangedHandler != null) { stateChangedHandler.Invoke(previousState, CurrentStateRepresentation.State); } } }
public void Fire<TArgument>(ParameterizedTrigger<TTrigger, TArgument> parameterizedTrigger, TArgument argument) { if (isRunning) throw new InvalidOperationException("State cannot be changed while in transition"); if (IsEnabled) { isRunning = true; var trigger = parameterizedTrigger.Trigger; var triggerRep = StateConfigurationHelper<TState, TTrigger>.FindTriggerRepresentation(trigger, currentStateRepresentation); if (triggerRep == null) { HandleInvalidTrigger(trigger); return; } var previousState = CurrentState; var predicate = triggerRep.ConditionalTriggerPredicate; if (predicate != null) { if (!predicate()) { HandleInvalidTrigger(trigger); return; } } // Handle ignored trigger if (triggerRep.NextStateRepresentation == null) { return; } // Catch invalid paramters before execution. Action<TArgument> triggerAction = null; try { triggerAction = (Action<TArgument>) triggerRep.OnTriggerAction; } catch (InvalidCastException) { InvalidTriggerParameterException<TTrigger>.Throw(trigger); return; } // Current exit var currentExit = currentStateRepresentation.OnExitAction; ExecuteAction(currentExit); // Trigger entry if (triggerAction != null) triggerAction(argument); var nextStateRep = triggerRep.NextStateRepresentation; // Next entry var nextEntry = nextStateRep.OnEntryAction; ExecuteAction(nextEntry); currentStateRepresentation = nextStateRep; // Raise state change event var stateChangedHandler = StateChanged; if (stateChangedHandler != null) { stateChangedHandler(previousState, currentStateRepresentation.State); } isRunning = false; } }
public void Fire(TTrigger trigger) { if (monitor.TryEnter()) { try { if (!IsEnabled) { return; } var triggerRep = StateConfigurationHelper <TState, TTrigger> .FindTriggerRepresentation(trigger, CurrentStateRepresentation); if (triggerRep == null) { HandleInvalidTrigger(trigger); return; } var previousState = CurrentState; var predicate = triggerRep.ConditionalTriggerPredicate; if (predicate != null) { if (!predicate()) { HandleInvalidTrigger(trigger); return; } } // Handle ignored trigger if (triggerRep.NextStateRepresentation == null) { return; } // Catch invalid paramters before execution. Action triggerAction = null; try { triggerAction = (Action)triggerRep.OnTriggerAction; } catch (InvalidCastException) { InvalidTriggerParameterException <TTrigger> .Throw(trigger); return; } // Current exit var currentExit = CurrentStateRepresentation.OnExitAction; ExecuteAction(currentExit); // Trigger entry ExecuteAction(triggerAction); var nextStateRep = triggerRep.NextStateRepresentation; // Next entry var nextEntry = nextStateRep.OnEntryAction; ExecuteAction(nextEntry); CurrentStateRepresentation = nextStateRep; // Raise state change event var stateChangedHandler = StateChanged; if (stateChangedHandler != null) { stateChangedHandler.Invoke(previousState, CurrentStateRepresentation.State); } } finally { monitor.Exit(); } } else { if (IsEnabled) { throw new InvalidOperationException("State cannot be changed while in transition. Use AsyncStateMachine or a BlockingStateMachine for these semantics."); } } }