public StateTransitionResult <TState, TTrigger> ExecuteAutoTransition(ExecutionParameters <T, TTrigger> parameters
                                                                              , StateTransitionResult <TState, TTrigger> currentResult)
        {
            if (AutoTransitions.TryGetValue(parameters.Trigger, out var autoTransitions))
            {
                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));
        }
Пример #2
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(_superState != null
                ? await _superState.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));
        }