!7 concept RewriteExample { S in, out; RewriteExample madeFrom; } concept Result { S in, out; RewriteExample madeFrom; } cmodule RewriteDatabase { transient CRUD rewriteExamplesCRUD; transient CRUD resultsCRUD; transient SingleComponentPanel scpSuggestions; transient ReliableSingleThread rstMakeSuggestions = dm_rst(me(), r makeSuggestions).cancelBeforeTrigger(); transient ReliableSingleThread rstProcessInput = dm_rst(me(), r processInput).cancelBeforeTrigger(); S input; start { rewriteExamplesCRUD = CRUD(RewriteExample); resultsCRUD = CRUD(Result); } visualize { JComponent c = jtabs( "Rewrite Examples", centerAndSouthWithMargin( rewriteExamplesCRUD.visualize(), jCenteredSection("Suggestions", jMinHeight(100, scpSuggestions = singleComponentPanel()))), "Input", northAndCenterWithMargins( dm_centeredTextFieldAsSection input(), jCenteredSection("Results", resultsCRUD.visualize())) ); resultsCRUD.addButton("Accept", r { acceptResult(Result) }); onTableSelectionChanged(rewriteExamplesCRUD.table(), rstMakeSuggestions); onConceptChangeByClass RewriteExample(rstMakeSuggestions); dm_watchFieldAndNow input(rstProcessInput); ret c; } void makeSuggestions { RewriteExample e = rewriteExamplesCRUD.selected(), ret if null; new L buttons; S transferred = transferCurlyBracketPhrases(e.out, e.in); if (neq(transferred, e.in)) buttons.add(jbutton("Change LHS to: " + transferred, r { cset(e, in := transferred) })); Set sharedPhrases = sharedCurlyBracketPhrases(e.in, e.out); if (nempty(sharedPhrases)) { S var = firstUnusedCountingDollarVar(e.in); for (S phrase : sharedPhrases) { S in2 = jreplaceIC_literal(e.in, curly(phrase), var); S out2 = jreplaceIC_literal(e.out, curly(phrase), var); if (!hasConceptIC RewriteExample(in := in2, out := out2)) buttons.add(jbutton("Replace " + curly(phrase) + " with " + var, r { cset(uniqIC_returnIfNew RewriteExample(in := in2, out := out2), madeFrom := e) })); } } setComponent(scpSuggestions, scrollableStackWithSpacing(buttons)); } void processInput { input = this.input; print("Processing input: " + input); deleteConcepts Result(); for ping (RewriteExample e) { if (containsDollarVars(e.in)) for (SS map : flexMatchDollarVarsIC_all(e.in, input)) cnew Result(in := input, out := replaceVars(e.out, map), using := e); } } void acceptResult(Result r) { if (r == null) ret; cset(uniqIC_returnIfNew RewriteExample(in := r.in, out := r.out), madeFrom := r.madeFrom); } }