{-# LANGUAGE CPP #-} #if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ >= 702 {-# LANGUAGE Trustworthy #-} #endif module Data.Isomorphism ( Iso(..) ) where import Data.Semigroupoid import Data.Groupoid import Control.Category import Prelude () data Iso k a b = Iso { embed :: k a b, project :: k b a } instance Semigroupoid k => Semigroupoid (Iso k) where Iso f g `o` Iso h i = Iso (f `o` h) (i `o` g) instance Semigroupoid k => Groupoid (Iso k) where inv (Iso f g) = Iso g f instance Category k => Category (Iso k) where Iso f g . Iso h i = Iso (f . h) (i . g) id = Iso id id