// select next leg of composite transitions after choice and junction pseudo states internal static Transition <TInstance> SelectTransition <TInstance>(this PseudoState <TInstance> pseudoState, TInstance instance, object message) where TInstance : IInstance <TInstance> { var results = pseudoState.Outgoing.Where(transition => transition.guard(message, instance)); if (pseudoState.Kind == PseudoStateKind.Choice) { return(results.Count() != 0 ? results.ElementAt(Extensions.RandomSelector(results.Count())) : pseudoState.FindElse()); } else { if (results.Count() > 1) { throw new Exception("Multiple outbound transition guards returned true at " + pseudoState + " for " + message); } else { return(results.SingleOrDefault() ?? pseudoState.FindElse()); } } }