private HandlerFuture GetSingleHandler(ScriptTree.Node node)
    {
        Debug.Assert(!node.Base.Contains("Event"));

        HandlerFuture handler = null;

        if (node.Members == null)
        {
            Type t = Type.GetType("Assets.Core.Handler." + node.Base);
            handler = Activator.CreateInstance(t, new Params(node.Params)) as HandlerFuture;
        }
        else
        {
            var start = node.Members.Find(m => m.Name == node.StartMember);
            handler = GetSingleHandler(start);
            var curr = start;
            while (curr.Name != node.EndMember)
            {
                Debug.Assert(curr.Succ != null && curr.Succ.Count == 1 && curr.Succ[0].Condition.Count == 0);
                var nextTree = node.Members.Find(m => m.Name == curr.Succ[0].Dest);
                var next     = GetSingleHandler(nextTree);
                handler.GroupAfter((_) => next);
                curr = nextTree;
            }
        }

        return(handler);
    }
 public StackElement(string name, HandlerFuture handler, ScriptTree.Node tree, ScriptTree.Succ prevSucc)
 {
     this.Name     = name;
     this.Handler  = handler;
     this.Node     = tree;
     this.PrevSucc = prevSucc;
 }
 private void ApplySucc(Dictionary <string, EventPromise> eventMap, HandlerFuture curr, ScriptTree.Succ succ, HandlerFuture next)
 {
     if (succ.Condition == null || succ.Condition.Count == 0)
     {
         curr.AddAfter((_) => next);
     }
     else if (succ.Condition.Count == 1)
     {
         curr.AddExternalCondition(eventMap[succ.Condition[0]], (_) => next, succ.EndPrev);
     }
     else
     {
         var combined = new OrEvent(eventMap[succ.Condition[0]], eventMap[succ.Condition[1]]);
         for (int i = 2; i < succ.Condition.Count; i++)
         {
             combined = new OrEvent(combined, eventMap[succ.Condition[i]]);
         }
         curr.AddExternalCondition(combined, (_) => next, succ.EndPrev);
     }
 }
 public CycleElement(HandlerFuture a, ScriptTree.Succ succ, HandlerFuture b)
 {
     this.A    = a;
     this.Succ = succ;
     this.B    = b;
 }