{-# LANGUAGE Safe #-}
module Data.Invertible.Internal
  ( invert
  , involution
  ) where

import Data.Invertible.Bijection

-- |Invert an isomorphism by exchanging the two arrows (same as 'Control.Invertible.BiArrow.invert').
invert :: Bijection a b c -> Bijection a c b
invert (f :<->: g) = g :<->: f
{-# INLINE invert #-}

-- |Construct an involution (an bijection where the function and inverse are the same) (overlaps with 'Control.Invertible.BiArrow.involve').
involution :: a b b -> Bijection a b b
involution f = f :<->: f
{-# INLINE involution #-}