srecord MatchJob(L input, L struct) { new SS vars; void clear { input = new L; struct = new L; } } static MatchJob matchJob_solved() { ret MatchJob(new L, new L); } sbool matchJob_isSolved(MatchJob mj) { ret mj != null && empty(mj.input) && empty(mj.struct); } static MatchJob matchJob_map(O f, MatchJob mj) { ret MatchJob((L) callF(f, mj.input), (L) callF(f, mj.struct)); } static void matchJob_apply(O f, MatchJob mj) { mj.input = (L) callF(f, mj.input); mj.struct = (L) callF(f, mj.struct); }