code: public <X1, X2, X3> F3<X1, X2, X3, R>
          compose(final Func3<? super X1, ? super X2, ? super X3, ? extends P1> before) {
              final F1<P1, R> me = this;
              return new F3<X1, X2, X3, R>() {
                  @Override
                  public R apply(X1 x1, X2 x2, X3 x3) {
                      return me.apply(before.apply(x1, x2, x3));
                  }
              };
          }
docs: Returns an {@code F3&lt;X1, X2, X3, R&gt;>} function by composing the specified
  {@code Func3&ltX1, X2, X3, P1&gt;} function with this function applied last
  
  @param <X1>
  the type of first param the new function applied to
  @param <X2>
  the type of second param the new function applied to
  @param <X3>
  the type of third param the new function applied to
  @param before
  the function to be applied first when applying the return function
  @return an new function such that f(x1, x2, x3) == apply(f1(x1, x2, x3))