abstract class BiFunction { public abstract B apply(A a); public abstract A unapply(B b); public BiFunction flip() { return new BiFunction() { public A apply(B b) { return BiFunction.this.unapply(b); } public B unapply(A a) { return BiFunction.this.apply(a); } }; } }