// get() works as expected (calculating the element on demand). // containsKey(), entrySet(), size() etc. only refer to the elements // already made. // Also allows put(). // Not synchronized sclass AutoMap extends AbstractMap { Map map = new HashMap; O f; *() {} *(O *f) {} *(IF1 *f) {} *(IF0 f) { this.f = if0ToIF1(f); } public B get(O a) { if (map.containsKey(a)) ret map.get(a); B b = cast f instanceof Class ? nu((Class) f) : callF(f, a); map.put((A) a, b); ret b; } // unclear semantics public bool containsKey(O a) { ret map.containsKey(a); } public Set> entrySet() { ret map.entrySet(); } public int size() { ret map.size(); } }