public PlainStateMachine(IEqualityComparer <TState> stateComparer, IEqualityComparer <TTrigger> triggerComparer) { if (stateComparer == null) { throw new ArgumentNullException(nameof(stateComparer)); } if (triggerComparer == null) { throw new ArgumentNullException(nameof(triggerComparer)); } _stateComparer = new StateEqualityComparer(stateComparer); _triggerComparer = new TriggerEqualityComparer(triggerComparer); _transitionEqualityComparer = new TransitionEqualityComparer(_stateComparer, _triggerComparer); _states = new Dictionary <TState, IState>(_stateComparer); _transitions = new HashSet <Transition <TState, TTrigger> >(_transitionEqualityComparer); _guardConditions = new Dictionary <Transition <TState, TTrigger>, List <IGuardCondition> >(_transitionEqualityComparer); _stateEventHandlers = new Dictionary <TState, HashSet <IStateEventHandler> >(_stateComparer); _transitionCommandQueue = new Queue <TransitionCommand>(); }
public PlainStateMachine(IEqualityComparer <TState> stateComparer, IEqualityComparer <TTrigger> triggerComparer) { if (stateComparer == null) { throw new ArgumentNullException(nameof(stateComparer)); } if (triggerComparer == null) { throw new ArgumentNullException(nameof(triggerComparer)); } _stateComparer = new StateEqualityComparer(stateComparer); _triggerComparer = new TriggerEqualityComparer(triggerComparer); _transitionComparer = new TransitionEqualityComparer <TState, TTrigger>(_stateComparer, _triggerComparer); _states = new PlainStateCollection <TState, TTrigger>(this, _stateComparer); _transitionValidator = new PlainTransitionValidator <TState, TTrigger>(this, _transitionComparer); _transitions = new PlainTransitionCollection <TState, TTrigger>(this, _stateComparer, _transitionComparer); _stateBehaviourScheduler = new PlainStateBehaviourScheduler <TState, TTrigger>(this, _states, _transitions, _transitionValidator, _stateComparer, _triggerComparer); _eventHandlers = new PlainStateEventHandlerCollection <TState, TTrigger>(this, _stateComparer); _eventDispatcher = new PlainEventDispatcher <TState, TTrigger>(_eventHandlers, _stateBehaviourScheduler); }
private HashSet<State> GetLiveStates(HashSet<State> states) { var dictionary = states.ToDictionary(s => s, s => new HashSet<State>()); foreach (State s in states) { foreach (Transition t in s.Transitions) { // TODO: Java code does not check for null states. if (t.To == null) { continue; } dictionary[t.To].Add(s); } } var comparer = new StateEqualityComparer(); var live = new HashSet<State>(this.GetAcceptStates(), comparer); var worklist = new LinkedList<State>(live); while (worklist.Count > 0) { State s = worklist.RemoveAndReturnFirst(); foreach (State p in dictionary[s]) { if (!live.Contains(p)) { live.Add(p); worklist.AddLast(p); } } } return live; }