// returns func(S) -> S or fails // returnFullText = false: return only answer static O ai_relateTwoTokens(S text1, S text2, L functionsToTry, bool returnFullText) { L t1 = javaTok(text1), t2 = javaTok(text2); if (l(t1) != l(t2)) quickFail(); L> diffs = differencesElementByElement_codeTokensOnly(t1, t2); if (l(diffs) != 2) quickFail(); Triple d1 = first(diffs), d2 = second(diffs); for (O f : functionsToUse) { if (checkFunctionOnPairs(f, ll(pair(d1.a, d2.a), pair(d1.b, d2.b)))) ret ai_relateTwoTokens_solver(t1, d1.c, d2.c, f, returnFullText); if (checkFunctionOnPairs(f, ll(pair(d2.a, d1.a), pair(d2.b, d1.b)))) ret ai_relateTwoTokens_solver(t1, d2.c, d1.c, f, returnFullText); } throw quickFail("No function found"); } static O ai_relateTwoTokens_solver(final L answerTmpl, final int i, final int j, fO f, final bool returnFullText) { ret func(S s) { L tok = javaTok(s); int l = l(tok); tok.addAll(subList(answerTmpl, l)); tok.set(j, (S) callF(f, tok.get(i))); ret returnFullText ? join(tok) : join(subList(tok, l-1)); }; }