!7 static SimpleLiveValue input = new(S); static L result; static NotTooOften notTooOften = onlyEvery10Secs(); static int maxInputLength = 120; static transient JTable table; static transient ReliableSingleThread rst; static JComponent visualize() { ret dataToTable_uneditable(result, table = sexyTable()); } static void unvisualize2() { table = null; } p { input.onChange(rst = ReliableSingleThread(r doIt)); } svoid update { S s = (S) callOpt(creator(), 'getInterestingString); if (nempty(s) && l(s) <= maxInputLength) { // TODO: more quality checks print("Have input: " + s + ", old input: " + input!); input.set(s); } } static void doIt() { print("doIt"); if (allowedToGoogleSomething()) calc(); } static void calc() { L> l = quickGoogle2(input!); result = map(l, func(T3 t) -> SS { litorderedmap("Result" := second(t), "Desc" := third(t), "Link" := first(t)) }); JTable t = table; if (t != null) dataToTable_uneditable(result, t); } sbool allowedToGoogleSomething() { ret notTooOften.canDoAgain_willDoIfTrue(); }