src/main/java/isomorphic/Isomorphism.java
default <A0> Isomorphism<A0, B> compose(Isomorphism<A0, A> before) {
        return of(
                compose((Function<A0, A>) before),
                before.inverse().compose((Function<B, A>) inverse())
        );
    }
/**
     * Returns a composed function that first applies the {@code before}
     * function to its input, and then applies this function to the result.
     *
     * @throws NullPointerException if {@code before} is null
     */
Returns a composed function that first applies the  before
function to its input, and then applies this function to the result.

@throws NullPointerException if  before is null
Returns a composed function that first applies the before function to its input and then applies this function to the result . @throws NullPointerException if before is null
default <A0> Isomorphism<A0, B> compose(Isomorphism<A0, A> before) {
        return of(
                compose((Function<A0, A>) before),
                before.inverse().compose((Function<B, A>) inverse())
        );
    }
default < A0 > Isomorphism < A0 , B > compose ( Isomorphism < A0 , A > before ) { return of ( compose ( ( Function < A0 , A > ) before ) , before . inverse ( ) . compose ( ( Function < B , A > ) inverse ( ) ) ) ; }
Returns a composed function that first applies the {@code before}
 function to its input, and then applies this function to the result.
Returns a composed function that first applies the { @code before } function to its input and then applies this function to the result .