public static TState PerformStraightforward <TState>(TState initialState, IStatefulTask <TState> initialTask) where TState : class { Logger.Message($"Initial state: {initialState}"); TState currentState = initialState; IStatefulTask <TState> currentTask = initialTask; try { Logger.Message("Starting performing."); while (!currentTask.IsFinal) { Logger.Message($"Executing task: {currentTask}."); currentTask = currentTask.DoAction(currentState); Logger.Message($"Current state: {currentState}."); } // Perform the final task. Logger.Message($"Executing task: {currentTask}."); currentTask.DoAction(currentState); } catch (Exception ex) { Logger.Exception(ex, "Exception occured during state machine performing."); } Logger.Message($"Final state: {currentState}"); return(currentState); }
public static TContext PerformStraightforward <TContext, TStateId>( TContext context, IStatefulTask <TContext, TStateId> initialTask, IReadOnlyDictionary <TStateId, IStatefulTask <TContext, TStateId> > transitions) { // We can log type names of state and tasks but it will be helpful for debugging. Logger.Debug($"Initial state: {context}"); IStatefulTask <TContext, TStateId> currentTask = initialTask; try { Logger.Debug("Starting performing."); while (!currentTask.IsFinal) { Logger.Debug($"Executing task: {currentTask}."); TStateId stateId = currentTask.DoAction(context); currentTask = transitions[stateId]; Logger.Debug($"Current state: {context}."); } // Perform the final task. Logger.Debug($"Executing task: {currentTask}."); currentTask.DoAction(context); } catch (Exception ex) { Logger.Exception(ex, "Exception occurred during state machine performing."); } Logger.Debug($"Final state: {context}"); return(context); }
public static TState PerformStraightforward <TState, TStateId>(TState initialState, IStatefulTask <TState, TStateId> initialTask, IReadOnlyDictionary <TStateId, IStatefulTask <TState, TStateId> > transitions) where TState : class { Logger.Message($"Initial state: {initialState}"); TState currentState = initialState; IStatefulTask <TState, TStateId> currentTask = initialTask; try { Logger.Message("Starting performing."); while (!currentTask.IsFinal) { Logger.Message($"Executing task: {currentTask}."); TStateId stateId = currentTask.DoAction(currentState); currentTask = transitions[stateId]; Logger.Message($"Current state: {currentState}."); } // Perform the final task. Logger.Message($"Executing task: {currentTask}."); currentTask.DoAction(currentState); } catch (Exception ex) { Logger.Exception(ex, "Exception occured during perform."); } Logger.Message($"Final state: {currentState}"); return(currentState); }
public override bool MoveNext() { bool isFinal = _current.IsFinal; // Perform the task before getting IsFinal flag because it can be changed. _current = _current.DoAction(State); return(!isFinal); }
public override bool MoveNext() { if (_current is null) { throw new InvalidOperationException("Invalid stateful task to process."); } bool isFinal = _current.IsFinal; // Perform the task after getting 'IsFinal' flag because we can face final task and do not call it 'DoAction' method. _current = _current.DoAction(State); return(!isFinal); }