packages feed

kindly-functors-0.1.0.0: src/Kindly/Iso.hs

module Kindly.Iso where

--------------------------------------------------------------------------------

import Control.Category (Category (..))
import Data.Kind (Type)
import Kindly.Class (Cat)

--------------------------------------------------------------------------------

-- | An invertible mapping between 'a' and 'b' in category 'cat'.
--
-- === Laws
--
-- @
-- 'fwd' '.' 'bwd' ≡ 'id'
-- 'bwd' '.' 'fwd' ≡ 'id'
-- @
data Iso cat a b = Iso {fwd :: a `cat` b, bwd :: b `cat` a}

instance (Category cat) => Category (Iso cat) where
  id :: (Category cat) => Iso cat a a
  id = Iso id id

  (.) :: Iso cat b c -> Iso cat a b -> Iso cat a c
  Iso fwd bwd . Iso fwd' bwd' = Iso (fwd . fwd') (bwd' . bwd)

type (<->) :: Cat Type
type (<->) = Iso (->)