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

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