Exemplo n.º 1
0
        private void AddOtherStateAutoTransition(TState otherState
                                                 , TTrigger trigger
                                                 , StateTransitionBase <T, TState, TTrigger> transition)
        {
            var otherStateConfig = GetTargetStateConfiguration(otherState);

            otherStateConfig.AddAutoTransition(trigger, transition);
        }
        /// <summary>
        /// Adds an automatic (forward or back) transition to the state configuration.
        /// </summary>
        /// <param name="trigger">The <see cref="TTrigger"/> to initiate this transition.</param>
        /// <param name="transition">The transition to add.</param>
        public void AddAutoTransition(TTrigger trigger, StateTransitionBase <T, TState, TTrigger> transition)
        {
            if (!AutoTransitions.TryGetValue(trigger, out var triggerTransitions))
            {
                triggerTransitions = new List <StateTransitionBase <T, TState, TTrigger> >();
                AutoTransitions.Add(trigger, triggerTransitions);
            }

            if (triggerTransitions.Any(t => t.Priority == transition.Priority))
            {
                throw new InvalidOperationException($"Auto transition for {State} state with priority {transition.Priority} already added.");
            }

            triggerTransitions.Add(transition);
        }
        /// <summary>
        /// Adds an allowable transition to the state configuration.
        /// </summary>
        /// <param name="trigger">Trigger to initiate the transition.</param>
        /// <param name="transition">The transition to add.</param>
        public void AddTransition(TTrigger trigger, StateTransitionBase <T, TState, TTrigger> transition)
        {
            if (!Transitions.TryGetValue(trigger, out var existingTransitions))
            {
                Transitions.Add(trigger, new List <StateTransitionBase <T, TState, TTrigger> > {
                    transition
                });
            }
            else
            {
                //??? State machine doesn't enforce this
                //if (existingTransitions.Any(t => t.Priority == transition.Priority))
                //{ throw new InvalidOperationException($"{trigger} trigger was previously added for {State} state as priority {transition.Priority}."); }

                existingTransitions.Add(transition);
            }
        }