!752 sclass Vessel { new L data; int index; *() {} *(L *data, int *index) {} void add(S s) { data.add(simplify(s)); } bool consume(S s) { if (end()) ret false; s = simplify(s); /*if (same(next(), s)) { ++index; ret true; } ret false;*/ //++index; if (!same(next(), s)) { --index; ret false; } ret true; } void restart() { index = 0; } // may be null if index after end S next() { ret end() ? null : get(data, index++); } bool end() { ret index >= l(data); } public Vessel clone() { ret new Vessel(cloneList(data), index); } } static S simplify(S s) { ret s.trim().toUpperCase(); } static bool same(S a, S b) { ret eq(a, b); } static new L vessels; p { new Vessel v; v.add("There is RAIN"); v.add("I need a COAT"); vessels.add(v); } synchronized answer { if (!tb()) null; for (Vessel v : vessels) { if (v.consume(s)) { S answer = v.next(); v.restart(); if (nempty(answer)) ret answer; } } }