Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
                }
            }
        }
Example #4
0
        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));
        }
Example #5
0
        public bool IsSubStateOf(TState state)
        {
            if (!IsSubState())
            {
                return(false);
            }

            return(state.Equals(SuperStateConfig.State) || SuperStateConfig.IsSubStateOf(state));
        }
Example #6
0
        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);
            }
        }
Example #7
0
        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);
            }
        }
Example #8
0
        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);
            }
        }
Example #9
0
        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));
        }
Example #10
0
 public void ExecuteReentryAction(T context, StateTransitionResult <TState, TTrigger> currentResult)
 {
     SuperStateConfig?.ExecuteReentryAction(context, currentResult);
     _reentryAction?.Invoke(context);
 }