Ejemplo n.º 1
0
        private static IEnumerable <Transition> SelectTransitions <TContext>(
            Model.ExecutableStatechart <TContext> statechart,
            object context,
            StateConfiguration stateConfiguration,
            IEvent @event)
            where TContext : IContext <TContext>
        {
            Option <Transition> FirstMatchingTransition(ParsedStatenode node) =>
            node.GetTransitions()
            .Where(transition => @event.Equals(transition.Event))
            .FirstOrDefault(transition => transition.IsEnabled(context, @event.Data)).ToOption();

            return(statechart
                   .GetActiveStatenodes(stateConfiguration)
                   .OrderByDescending(statenode => statenode.Depth)
                   .Aggregate(
                       (excluded: Enumerable.Empty <ParsedStatenode>(), transitions: Enumerable.Empty <Transition>()),
                       (tuple, current) =>
                       tuple.excluded.Contains(current)
                             ? tuple
                             : FirstMatchingTransition(current).Match(
                           transition => (
                               excluded: tuple.excluded.Concat(current.GetParents()),
                               transitions: transition.IsForbidden
                                         ? tuple.transitions
                                         : tuple.transitions.Append(transition)),
                           () => tuple))
                   .transitions);
        }
Ejemplo n.º 2
0
        private static IEnumerable <Microstep> ResolveSingleEvent <TContext>(
            Model.ExecutableStatechart <TContext> statechart,
            object context,
            StateConfiguration stateConfiguration,
            IEvent @event)
            where TContext : IContext <TContext>
        {
            // TODO: this sucks
            var transitions = SelectTransitions(statechart, context, stateConfiguration, @event);
            var microsteps  = ComputeMicrosteps(transitions, context, stateConfiguration, @event);

            return(microsteps);
        }