public static StateMachineGraph GetGraph <TInstance>(this StateMachine <TInstance> machine)
            where TInstance : class
        {
            var inspector = new GraphStateMachineVisitor <TInstance>();

            machine.Accept(inspector);

            return(inspector.Graph);
        }
Example #2
0
        /// <summary>
        /// Initialise a state machine model.
        /// </summary>
        /// <typeparam name="TInstance">The type of the state machine instance.</typeparam>
        /// <param name="model">The state machine model to initialise.</param>
        /// <remarks>Initialising a state machine model precompiles all the transition behavior for performance. The root state machine maintains a clean/dirty flag to track if reinitialisation is required.</remarks>
        public static void Initialise <TInstance>(this StateMachine <TInstance> model) where TInstance : IInstance <TInstance>
        {
            // log as required
            Console.WriteLine("initialise " + model);

            // initialise the state machine model
            model.Accept(new InitialiseElements <TInstance>(), false);
            model.Clean = true;
        }
        public override void VisitStateMachine(StateMachine <TInstance> stateMachine, bool deepHistoryAbove)
        {
            base.VisitStateMachine(stateMachine, deepHistoryAbove);

            // initiaise all the transitions once all the elements have been initialised
            stateMachine.Accept(new InitialiseTransitions <TInstance>(), this.Behaviour);

            // define the behaviour for initialising a state machine instance
            stateMachine.OnInitialise = this.Behaviour(stateMachine).Enter;
        }
Example #4
0
        public static IEnumerable <Token> Tokenize(IEnumerable <char> text)
        {
            var stateMachine = new StateMachine();

            foreach (var symbol in text)
            {
                foreach (Token token in stateMachine.Accept(symbol))
                {
                    yield return(token);
                }
            }

            foreach (Token token in stateMachine.AcceptEndOfStream())
            {
                yield return(token);
            }
        }
Example #5
0
 /// <summary>
 /// Validates a state machine model for correctness.
 /// </summary>
 /// <typeparam name="TInstance">The type of the state machine instance.</typeparam>
 /// <param name="model">The state machine model.</param>
 /// <remarks>The validation criteria are largely drawn from the UML 2 Superstructure Specification.</remarks>
 public static void Validate <TInstance>(this StateMachine <TInstance> model) where TInstance : IInstance <TInstance>
 {
     model.Accept(new Validator <TInstance>());
 }