Exemple #1
0
        // 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());
                }
            }
        }