public async Task <StateTransitionResult <TState, TTrigger> > FireTriggerAsync(ExecutionParameters <T, TTrigger> parameters) { if (_triggerActions.TryGetValue(parameters.Trigger, out var triggerAction)) { await triggerAction.ExecuteAsync(parameters.Context, request : parameters.Request, cancellationToken : parameters.CancellationToken) .ConfigureAwait(continueOnCapturedContext: false); } var result = await fireTriggerPrimAsync(parameters).ConfigureAwait(continueOnCapturedContext: false); if (!(result?.WasTransitioned ?? false) && SuperStateConfig != null) { result = await SuperStateConfig.FireTriggerAsync(parameters).ConfigureAwait(continueOnCapturedContext: false); } else { var startState = StateAccessor(parameters.Context); result ??= new StateTransitionResult <TState, TTrigger>(parameters.Trigger , startState , startState , startState , lastTransitionName: string.Empty , transitionDefined: false); } return(result); }
public StateTransitionResult <TState, TTrigger> FireTrigger(ExecutionParameters <T, TTrigger> parameters) { if (_triggerActions.TryGetValue(parameters.Trigger, out var triggerAction)) { triggerAction.Execute(parameters); } var result = FireTriggerPrim(parameters); if (!(result?.WasTransitioned ?? false) && SuperStateConfig != null) { result = SuperStateConfig.FireTrigger(parameters); } else { var startState = StateAccessor(parameters.Context); result ??= new StateTransitionResult <TState, TTrigger>(parameters.Trigger , startState , startState , startState , string.Empty , transitionDefined: false); } return(result); }
public async Task ExecuteEntryActionAsync(ExecutionParameters <T, TTrigger> parameters, StateTransitionResult <TState, TTrigger> currentResult) { //If there's an entry action for a new super state, execute it first if (SuperStateConfig != null && !IsSubStateOf(currentResult.PreviousState)) { await SuperStateConfig.ExecuteEntryActionAsync(parameters, currentResult); } //Is there an action based on the new state? if (_previousStateEntryActions.TryGetValue(currentResult.PreviousState, out var action)) { if (parameters.CancellationToken.IsCancellationRequested) { return; } await action.Invoke(parameters.Context, parameters.CancellationToken).ConfigureAwait(continueOnCapturedContext: false); } //Is there an action for any entry? if (_defaultEntryAction != null) { if (parameters.CancellationToken.IsCancellationRequested) { return; } if (_defaultEntryAction != null) { await _defaultEntryAction.Invoke(parameters.Context, parameters.CancellationToken).ConfigureAwait(continueOnCapturedContext: false); } } }
public async Task <StateTransitionResult <TState, TTrigger> > ExecuteAutoTransitionAsync(ExecutionParameters <T, TTrigger> parameters , StateTransitionResult <TState, TTrigger> currentResult) { if (AutoTransitions.TryGetValue(parameters.Trigger, out var triggerTransitions)) { foreach (var transition in triggerTransitions.OrderBy(t => t.Priority)) { var localResult = await transition.ExecuteAsync(parameters, currentResult) .ConfigureAwait(continueOnCapturedContext: false); if (localResult.WasTransitioned) { return(localResult); } } } //Check for a super state and just return the incoming currentResult if no successful auto transitions return(SuperStateConfig != null ? await SuperStateConfig.ExecuteAutoTransitionAsync(parameters, currentResult).ConfigureAwait(continueOnCapturedContext: false) : new StateTransitionResult <TState, TTrigger>(parameters.Trigger , currentResult.StartingState , currentResult.PreviousState , currentResult.CurrentState , currentResult.LastTransitionName , transitionDefined: true , wasCancelled: parameters.CancellationToken.IsCancellationRequested , conditionMet: false)); }
public bool IsSubStateOf(TState state) { if (!IsSubState()) { return(false); } return(state.Equals(SuperStateConfig.State) || SuperStateConfig.IsSubStateOf(state)); }
public async Task ExecuteReentryActionAsync(ExecutionParameters <T, TTrigger> parameters, StateTransitionResult <TState, TTrigger> currentResult) { if (SuperStateConfig != null) { await SuperStateConfig.ExecuteReentryActionAsync(parameters, currentResult) .ConfigureAwait(continueOnCapturedContext: false); } if (_reentryAction != null && !parameters.CancellationToken.IsCancellationRequested) { await _reentryAction.Invoke(parameters.Context, parameters.CancellationToken) .ConfigureAwait(continueOnCapturedContext: false); } }
public void ExecuteExitAction(T context, StateTransitionResult <TState, TTrigger> currentResult) { //Is there an action based on the new state? if (_nextStateExitActions.TryGetValue(currentResult.CurrentState, out var action)) { action.Invoke(context); } //Is there an action for any exit? _defaultExitAction?.Invoke(context); if (SuperStateConfig != null && !IsSubStateOf(currentResult.CurrentState)) { SuperStateConfig.ExecuteExitAction(context, currentResult); } }
public void ExecuteEntryAction(T context, StateTransitionResult <TState, TTrigger> currentResult) { //If we haven't previously executed entry for superstate, execute it first if (SuperStateConfig != null && !IsSubStateOf(currentResult.PreviousState)) { SuperStateConfig.ExecuteEntryAction(context, currentResult); } //Is there an action based on the new state? if (_previousStateEntryActions.TryGetValue(currentResult.PreviousState, out var action)) { action.Invoke(context); } //Is there an action for any entry? Don't execute if moving from sub-state if (!getTargetStateConfiguration(currentResult.PreviousState).IsSubStateOf(State)) { _defaultEntryAction?.Invoke(context); } }
public StateTransitionResult <TState, TTrigger> ExecuteAutoTransition(ExecutionParameters <T, TTrigger> parameters , StateTransitionResult <TState, TTrigger> currentResult) { if (!AutoTransitions.TryGetValue(parameters.Trigger, out var autoTransitions)) { return(SuperStateConfig != null ? SuperStateConfig.ExecuteAutoTransition(parameters, currentResult) : new StateTransitionResult <TState, TTrigger>(parameters.Trigger , currentResult.CurrentState , currentResult.CurrentState , currentResult.CurrentState , string.Empty , transitionDefined: false , conditionMet: false)); } foreach (var transition in autoTransitions.OrderBy(t => t.Priority)) { var localResult = transition.Execute(parameters, currentResult); if (localResult.WasTransitioned) { return(localResult); } } //Check for a super state and just return the incoming currentResult if no successful auto transitions return(SuperStateConfig != null ? SuperStateConfig.ExecuteAutoTransition(parameters, currentResult) : new StateTransitionResult <TState, TTrigger>(parameters.Trigger , currentResult.CurrentState , currentResult.CurrentState , currentResult.CurrentState , string.Empty , transitionDefined: false , conditionMet: false)); }
public void ExecuteReentryAction(T context, StateTransitionResult <TState, TTrigger> currentResult) { SuperStateConfig?.ExecuteReentryAction(context, currentResult); _reentryAction?.Invoke(context); }