1 | sclass NewWoody { |
2 | transient Map<S, BBRule> rulesByName; |
3 | transient new L<BBRule> badRules; |
4 | |
5 | Map<S, RuleData> ruleData = ciMap(); |
6 | S lastOutput; |
7 | BBRule lastRule, activeRule, gotoRule; |
8 | S prefix = "BB | "; |
9 | |
10 | sclass RuleData { |
11 | int answerIndex; |
12 | } |
13 | |
14 | RuleData ruleData(BBRule rule) { |
15 | ret getOrCreate(ruleData, rule.listName, RuleData.class); |
16 | } |
17 | |
18 | *() { |
19 | if (!DynamicObject_isLoading()) |
20 | rulesByName = indexFieldAsCIMap('listName, bb_allRules()); |
21 | } |
22 | |
23 | *(NewWoody w) { initFrom(w); } |
24 | |
25 | void initFrom(NewWoody w) { |
26 | copyFields(w, this, 'rulesByName, 'badRules); |
27 | } |
28 | |
29 | void processInput(S input) { |
30 | lastRule = null; |
31 | lastOutput = null; |
32 | |
33 | temp tempSetTL(ctxContext_var(), nu(CtxContext, +input)); |
34 | new L<BBRule> matching; |
35 | if (nempty(input)) |
36 | for (BBRule r : valuesList(rulesByName)) |
37 | if (ruleExpressionMatches(r)) |
38 | matching.add(r); |
39 | |
40 | setActiveRule(or(first(matching), activeRule)); |
41 | repeat 10 { |
42 | gotoRule = null; |
43 | doRule(); |
44 | if (gotoRule == null) break; |
45 | setActiveRule(gotoRule); |
46 | } |
47 | } |
48 | |
49 | void doRule { |
50 | if (activeRule != null) |
51 | if (cic(activeRule.answerMode, 'random)) // TODO: mark seen |
52 | setOutput(random(activeRule.answers)); |
53 | else if (cic(activeRule.answerMode, 'switch)) { |
54 | for (S s : activeRule.answers) { |
55 | LS l = splitAtDoubleArrow(s); |
56 | if (l(l) == 2 && print(first(l), ctxEvalCondition(first(l)))) { |
57 | setOutput(second(l)); |
58 | break; |
59 | } |
60 | } |
61 | } else { |
62 | // loop |
63 | RuleData rd = ruleData(activeRule); |
64 | setOutput(get(activeRule.answers, |
65 | rd.answerIndex %= max(1, l(activeRule.answers)))); |
66 | ++rd.answerIndex; |
67 | } |
68 | } |
69 | |
70 | bool ruleExpressionMatches(BBRule r) { |
71 | if (empty(r.expression)) false; |
72 | try { |
73 | ret ctxEvalCondition(r.expression); |
74 | } catch print e { |
75 | badRules.add(r); |
76 | rulesByName.remove(r.listName); |
77 | false; |
78 | } |
79 | } |
80 | |
81 | L<BBRule> listsMatchingInput(S input) { |
82 | temp tempSetTL(ctxContext_var(), nu(CtxContext, +input)); |
83 | ret [BBRule r : valuesList(rulesByName) | ruleExpressionMatches(r)]; |
84 | } |
85 | |
86 | void setOutput(S s) { |
87 | new Matches m; |
88 | if (swic_trim(trim(lastLine(s)), "goto:", m)) { |
89 | S ruleName = prefix + m.rest(); |
90 | gotoRule = rulesByName.get(ruleName); |
91 | print("Goto: " + ruleName + " (" + yesNo(gotoRule != null) + ")"); |
92 | s = dropLastLine(s); |
93 | } |
94 | lastOutput = appendSpaceIfNempty(lastOutput) + s; |
95 | } |
96 | |
97 | void setActiveRule(BBRule rule) { |
98 | activeRule = lastRule = or(rule, activeRule); |
99 | } |
100 | } |
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1018362 |
Snippet name: | NewWoody |
Eternal ID of this version: | #1018362/35 |
Text MD5: | a3515a5e35f74d3ab0bbf4b03ed9be0b |
Author: | stefan |
Category: | javax / a.i. |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2018-12-24 16:22:16 |
Source code size: | 2709 bytes / 100 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 450 / 1070 |
Version history: | 34 change(s) |
Referenced in: | [show references] |