!7 sclass Transformed { S input, transformed; new LS madeBy; } compact module TransformedInput extends DynObjectTable { start { set fieldsInOrder; dm_onTopInput_q(voidfunc(S s) { setData(objectsWhere(getData(), input := s)); }); } // API void addEntry(S input, S transformed, S madeBy) { if (empty(transformed) || eq(input, transformed) || neq(input, dm_topInput())) ret; lock lock; Transformed l = objectWhere(getData(), +input, +transformed); bool nu = l == null; if (nu) l = nu(Transformed, +input, +transformed); setAdd(l.madeBy, madeBy); if (nu) add(l); else setData_force(data); } }