static Steppable nlLogic_fillBattleSpace_steppable(final NLLogicChecker_v2 c, final Collector battleSpace, final bool debug) { ret new SplittableSteppable { volatile bool done; SplittableSteppable inner; { VF2 onRuleFired = voidfunc(IfThen rule, NLLogicChecker_v2.Matching m) { if (battleSpace.add(new RuleWithParams(rule, m.matches))) set done; }; VF4, Exp> onRuleFailed = voidfunc(IfThen rule, NLLogicChecker_v2.Matching m, L satisfiedConditions, Exp remaining) { //print("satisfied conditions: " + satisfiedConditions); if (battleSpace.add(new FailedRule(rule, m.matches, cloneListOrNull(nullIfEmpty(satisfiedConditions)), remaining))) set done; }; print("Iterating over " + n2(c.rules, "rule")); applyNLLogicFacts_v4_iterate_steppable_verbose.set(debug); inner = applyNLLogicFacts_v4_iterate_steppable(c, onRuleFired, onRuleFailed, c.rules); } public bool step() { ret !done && inner.step(); } public L split(int n) { ret map(inner.split(n), func(final Steppable inner2) -> Steppable { ret new Steppable { public bool step() { ret !done && inner2.step(); } }; }); } }; }