pub fn iso_symm<A: 'static, B: 'static>() -> ISO<ISO<A, B>, ISO<B, A>> {
    (
        Box::new(|ab: ISO<A, B>| iso(
            { let ab1 = ab.1; move |x| ab1(x) },
            { let ab0 = ab.0; move |x| ab0(x) },
        )),
        Box::new(|ba: ISO<B, A>| iso(
            { let ba1 = ba.1; move |x| ba1(x) },
            { let ba0 = ba.0; move |x| ba0(x) },
        )),
    )
    // iso(
    //     |ab: ISO<A, B>| iso(|x| ab.1(x), |x| ab.0(x)),
    //     |ba: ISO<B, A>| iso(|x| ba.1(x), |x| ba.0(x)),
    // )
}
/// And we have isomorphism on isomorphism!
And we have isomorphism on isomorphism!
And we have isomorphism on isomorphism!
pub fn iso_symm<A: 'static, B: 'static>() -> ISO<ISO<A, B>, ISO<B, A>> {
    (
        Box::new(|ab: ISO<A, B>| iso(
            { let ab1 = ab.1; move |x| ab1(x) },
            { let ab0 = ab.0; move |x| ab0(x) },
        )),
        Box::new(|ba: ISO<B, A>| iso(
            { let ba1 = ba.1; move |x| ba1(x) },
            { let ba0 = ba.0; move |x| ba0(x) },
        )),
    )
    // iso(
    //     |ab: ISO<A, B>| iso(|x| ab.1(x), |x| ab.0(x)),
    //     |ba: ISO<B, A>| iso(|x| ba.1(x), |x| ba.0(x)),
    // )
}
pub fn iso_symm < A : ' static , B : ' static > ( ) -> ISO < ISO < A , B > , ISO < B , A > > { ( Box :: new ( | ab : ISO < A , B > | iso ( { let ab1 = ab . 1 ; move | x | ab1 ( x ) } , { let ab0 = ab . 0 ; move | x | ab0 ( x ) } , ) ) , Box :: new ( | ba : ISO < B , A > | iso ( { let ba1 = ba . 1 ; move | x | ba1 ( x ) } , { let ba0 = ba . 0 ; move | x | ba0 ( x ) } , ) ) , ) // iso( //     |ab: ISO<A, B>| iso(|x| ab.1(x), |x| ab.0(x)), //     |ba: ISO<B, A>| iso(|x| ba.1(x), |x| ba.0(x)), // ) }
And we have isomorphism on isomorphism!
And we have isomorphism on isomorphism!