{-# LANGUAGE Safe, TypeOperators #-}
module Data.Invertible.Function
( id
, (.)
, consts
, const
, flip
) where
import Prelude hiding (id, (.), const, flip)
import qualified Control.Category as C
import qualified Data.Function as F
import Data.Invertible.Bijection
id :: a <-> a
id = C.id
(.) :: (b <-> c) -> (a <-> b) -> a <-> c
(.) = (C..)
infixr 9 .
consts :: a -> b -> a <-> b
consts a b = F.const b :<->: F.const a
const :: a -> () <-> a
const = consts ()
flip :: (a -> b -> c) <-> (b -> a -> c)
flip = F.flip :<->: F.flip