interface Iso<T, R> { T deply(R r); default Iso<R, T> inverse() { final Iso<T, R> z = this; return new Iso<R, T>() { @Override public R deply(T t) { throw null; } }; } static <T, R> Iso<R, T> inverse(Iso<T, R> z) { return new Iso<R, T>() { @Override public R deply(T t) { throw null; } }; } }