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