// f : Concept -> Concept static Concept conceptGraphMap(Concept c, O f) { ret conceptGraphMap_impl(c, f, new IdentityHashMap); } static Concept conceptGraphMap_impl(Concept c, O f, IdentityHashMap seen) { if (seen.containsKey(c)) ret seen.get(c); Concept d = cast callF(f, c); if (d != c) { seen.put(c, d); ret d; } d = cnew(c.getClass()); seen.put(c, d); for (S field : conceptFields(c)) { O val = cget(c, field); if (!val instanceof Concept) cset(d, field, val); else cset(d, field, conceptGraphMap_impl(val/Concept, f, seen)); } ret d; }