private void AddTransition(S fromState, E evt, ITransition <S, E, C> transition)
        {
            //TODO(WH): create an extension for IDictionary<T>.ComputeIfAbsent(key, k => new T()).
            var map = (EventToTransitionsMap)null;

            if (!m_TransitionMap.TryGetValue(fromState, out map))
            {
                map = new EventToTransitionsMap();
                m_TransitionMap.Add(fromState, map);
            }
            var transitions = (TransitionCollection)null;

            if (!map.TryGetValue(evt, out transitions))
            {
                transitions = new TransitionCollection();
                map.Add(evt, transitions);
            }
            transitions.Add(transition);
        }
예제 #2
0
        private bool FireEvent(IStateMachine <S, E, C> machine, E evt, EventToTransitionsMap transitionMap, S fromState, C context)
        {
            if (transitionMap == null)
            {
                return(false);
            }
            var transitions = (TransitionCollection)null;

            if (!transitionMap.TryGetValue(evt, out transitions))
            {
                return(false);
            }
            foreach (var transition in transitions)
            {
                if (transition.IsSatisfied(context))
                {
                    SetStateWithEntryExitActions(machine, fromState, transition.To, transition, evt, context);
                    return(true);
                }
            }
            return(false);
        }