sclass Rule { new L in; new L out; *() {} *(L *in, L *out) {} } static L parseRules(S text) { L log = toLinesTrim2(text); L emptyLines = concatLists(ll(-1), indexesOf(log, ""), ll(l(log))); new L rules; for (int ii = 0; ii+1 < l(emptyLines); ii++) { int i = emptyLines.get(ii), j = emptyLines.get(ii+1); L l = subList(log, i+1, j); continue if empty(l); L arrows = indexesOfLinesStartingWith(l, "->"); if (empty(arrows)) continue; // it's a rule for (int ia : arrows) l.set(ia, dropPrefixTrim("->", l.get(ia))); rules.add(new Rule( subList(l, 0, first(arrows)), subList(l, first(arrows)))); } ret rules; }