!7

sclass Suggestion {
  RuleWithParams rule;
  S output;
  
  *() {}
  *(RuleWithParams *rule, S *output) {}
}

sclass TestBot extends DynObjectTable<RuleWithParams> {
  InputChooser inputChooser = new(this);
  
  start { inputChooser.delay = 1000; }
  
  visualize {
    ret northAndCenter(wrap(inputChooser), super.visualize());
  }
  
  void update { if (inputChooser.update()) update(inputChooser.input()); }
  
  void update(S input) {
    new NLLogicChecker_v3 c;
    c.input = input;
    Pair<L<IfThen>, LS> rulesAndFacts = ai_activeRulesAndFacts();
    c.facts = reversed(rulesAndFacts.b);
    c.rules = reversed(rulesAndFacts.a); // latest rules first!
    c.rules = [IfThen r : c.rules | ai_ruleAccessesInput(r)];
    c.rules = nlLogic_safeLHSEvalsOnly(c.rules);
    c.useIterate = true;
    new L<RuleWithParams> battleSpace;
    nlLogic_fillBattleSpace(c, battleSpace, false);
    //print("l=" + l(battleSpace));
    setData(map(battleSpace, func(RuleWithParams r) -> Suggestion {
      Suggestion(r, nlLogic_outputFromRuleWithParams(r))
    }));
  }
}