using uCalcSoftware;

var uc = new uCalc();

static void ShortCircuitOr(uCalc.Callback cb) {
   var arg1 = cb.ArgExpr(1);
   var arg2 = cb.ArgExpr(2);

   // Evaluate the first argument
   var result1 = arg1.EvaluateBool();

   // If the first is true, return immediately without touching the second
   if (result1) {
      cb.ReturnBool(true);
   } else {
      // Otherwise, evaluate and return the second argument's result
      cb.ReturnBool(arg2.EvaluateBool());
   }
}

static void FuncA(uCalc.Callback cb) {
   cb.uCalc.Eval("countA = countA + 1");
   cb.ReturnBool(true);
}

static void FuncB(uCalc.Callback cb) {
   cb.uCalc.Eval("countB = countB + 1");
   cb.ReturnBool(true);
}


uc.DefineVariable("countA = 0");
uc.DefineVariable("countB = 0");

uc.DefineFunction("FuncA() As Bool", FuncA);
uc.DefineFunction("FuncB() As Bool", FuncB);

uc.DefineFunction("SC_Or(ByExpr a, ByExpr b) As Bool", ShortCircuitOr);

Console.WriteLine("Calling SC_Or(FuncA(), FuncB())...");
uc.Eval("SC_Or(FuncA(), FuncB())");

Console.WriteLine($"FuncA was called {uc.Eval("countA")} time(s).");
Console.WriteLine($"FuncB was called {uc.Eval("countB")} time(s)."); // Should be 0