// get() works as expected (calculating the element on demand).
// containsKey(), entrySet(), size() etc. only refer to the elements
// already made.
sclass AutoMap extends AbstractMap {
Map map = new HashMap;
O f;
*() {}
*(O *f) {}
*(IF1 *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(); }
}