public IEnumerable <IState <TState, TEvent> > ExecuteTraversal(ITransitionContext <TState, TEvent> context, IState <TState, TEvent> sourceState, IState <TState, TEvent> targetState, Action <ITransitionContext <TState, TEvent> > transitionAction) { if (sourceState == null) { sourceState = new OverState(); } var exitedStates = new List <IState <TState, TEvent> >(); var enteredStates = new List <IState <TState, TEvent> >(); GetStateChanges(sourceState, targetState, exitedStates, enteredStates); var finalStates = new List <IState <TState, TEvent> >(); TraverseToEntrySubstates(enteredStates, targetState, finalStates); exitedStates.ForEach(s => s.Exit(context)); if (transitionAction != null) { transitionAction(context); } enteredStates.ForEach(s => s.Entry(context)); return(finalStates); }
public AbstractState makeState(string stateName, string p1, string p2, string p3, float precision, float grados, string stateType, int posState1, int posState2) { AbstractState aS; AbstractState aS1 = getState(posState1); AbstractState aS2 = getState(posState2); switch (stateType) { case "AND": aS = new AndState(aS1, aS2, stateName); break; case "ANGLE": aS = new AngleState(p1, p3, p2, grados, precision, stateName); break; case "CENTER_X": aS = new CenterStateX(p1, p2, precision, stateName); break; case "CENTER_Y": aS = new CenterStateY(p1, p2, precision, stateName); break; case "CENTER_Z": aS = new CenterStateZ(p1, p2, precision, stateName); break; case "DISTANCE": aS = new DistanceState(p1, p2, precision, stateName); break; case "LEFT": aS = new LeftState(p1, p2, precision, stateName); break; case "OR": aS = new OrState(aS1, aS2, stateName); break; case "OVER": aS = new OverState(p1, p2, precision, stateName); break; case "POSITION": aS = new PositionState(p1, precision, stateName); break; case "RIGHT": aS = new RightState(p1, p2, precision, stateName); break; case "UNDER": aS = new UnderState(p1, p2, precision, stateName); break; default: aS = new InvalidState(stateName); break; } return(aS); }