sclass C { char c; bool output; *() {} *(char *c, bool *output) {} public bool equals(O o) { ret o instanceof C && c == ((C) o).c && output == ((C) o).output; } public int hashCode() { ret (int) c + (output ? 0x1000 : 0); } } static L poemToC(S poemID) { new L l; for (E e : parsePoem(poemID)) if (e.q != null) addC(l, e.q + "\n", false); else if (e.a != null) addC(l, e.a + "\n", true); ret l; } static void addC(L script, S s, bool output) { for (char c : asChars(s)) script.add(new C(c, output)); } static L poemFromC(L script) { new L l; int i = 0; while (i < l(script)) { new E e; int j = poemFromC_scan(script, i, false); if (j > i) e.q = poemFromC_join(script, i, j); else { j = poemFromC_scan(script, i, true); assertTrue(j > i); e.a = poemFromC_join(script, i, j); } l.add(e); i = j; } ret l; } static int poemFromC_scan(L script, int i, bool output) { while (i < l(script) && script.get(i).output == output) ++i; ret i; } static S poemFromC_join(L script, int i, int j) { new StringBuilder buf; for (; i < j; i++) buf.append(script.get(i).c); ret str(buf); }