code: public static <T1, T2, R> Function2<T1, T2, R> memoizeBiFunction(final BiFunction<T1, T2, R> fn) {
          Function1<Tuple2<T1, T2>, R> memoise2 = memoizeFunction((final Tuple2<T1, T2> pair) -> fn.apply(pair._1(), pair._2()));
          return (t1, t2) -> memoise2.apply(tuple(t1, t2));
      }
docs: Convert a BiFunction into one that caches it's result
  
  @param fn BiFunction to memoise
  @return Memoised BiFunction