static F1 wrapF1WithCache(final Map cache, final F1 f) { if (cache == null) ret f; if (f == null) null; ret func(A a) -> B { B b = cache.get(a); if (b == null) cache.put(a, b = callF(f, a)); ret b; }; }