public override TR Drive(Context ctx) { var thisContinuation = ctx.Continuation; var value = default(T); var skipIoGet = false; if (thisContinuation != null) { // Continuation ctx.Continuation = thisContinuation.SubContinuation; // 0表示需要继续ioGet // 1表示需要继续subTree if (thisContinuation.NextStep == 1) { skipIoGet = true; value = (T)thisContinuation.Param; } } if (!skipIoGet) { value = ioGet.GetUserValue().Drive(ctx); if (ctx.Continuation != null) { // ioGet抛出了Continue if (thisContinuation == null) { thisContinuation = new Continuation() { SubContinuation = ctx.Continuation, NextStep = 0, }; } else { thisContinuation.SubContinuation = ctx.Continuation; thisContinuation.NextStep = 0; } ctx.Continuation = thisContinuation; return(default(TR)); } } var oldValue = box.SetVal(value); var ret = subTree.GetUserValue().Drive(ctx); box.SetVal(oldValue); if (ctx.Continuation != null) { // subTree抛出了Continue if (thisContinuation == null) { thisContinuation = new Continuation() { SubContinuation = ctx.Continuation, }; } ctx.Continuation = thisContinuation; thisContinuation.Param = value; } return(ret); }
public override bool Drive(Context ctx) { return(((T)ctx.Self).HpRateLessThan(p0.GetUserValue())); }
public static Thunk <float> Plus(Thunk <float> a, Thunk <float> b) { return(Help.MakePureThunk(a.GetUserValue() + b.GetUserValue())); }