public static <A, B, C> Function<A, C> compose(Function<B, C> g, Function<A, ? extends B> f) {
    return new FunctionComposition<>(g, f);
  }
public static <A, B, C> Function<A, C> compose(Function<B, C> g, Function<A, ? extends B> f) {
    return new FunctionComposition<>(g, f);
  }
public static < A , B , C > Function < A , C > compose ( Function < B , C > g , Function < A , ? extends B > f ) { return new FunctionComposition <> ( g , f ) ; }
Returns the composition of two functions. For {@code f: A->B} and {@code g: B->C}, composition
is defined as the function h such that {@code h(a) == g(f(a))} for each {@code a}.

<p><b>Java 8 users:</b> use {@code g.compose(f)} or (probably clearer) {@code f.andThen(g)}
instead.

@param g the second function to apply
@param f the first function to apply
@return the composition of {@code f} and {@code g}
@see <a href="//en.wikipedia.org/wiki/Function_composition">function composition</a>
Returns the composition of two functions . For { @code f : A - > B } and { @code g : B - > C } composition is defined as the function h such that { @code h ( a ) == g ( f ( a )) } for each { @code a } .