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); }
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); }