multivariant-0.1.0.1: src/Data/Invertible/Profunctor.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}
module Data.Invertible.Profunctor where
import Prelude hiding ((.), id, fst, snd, curry)
import qualified Prelude as P
import Data.Invertible.Bijection
import Data.Invertible.Function
-- | Class 'IsoProfunctor' represents a profunctor from @Iso@ -> @Hask@ (?)
--
-- @'dimap' 'id' 'id' ≡ 'id'@
--
-- @
-- 'lmap' 'id' ≡ 'id'
-- 'rmap' 'id' ≡ 'id'
-- @
--
-- @'dimap' f g ≡ 'lmap' f '.' 'rmap' g@
--
--
-- @
-- 'dimap' (f '.' g) (h '.' i) ≡ 'dimap' g h '.' 'dimap' f i
-- 'lmap' (f '.' g) ≡ 'lmap' g '.' 'lmap' f
-- 'rmap' (f '.' g) ≡ 'rmap' f '.' 'rmap' g
-- @
class IsoProfunctor p where
dimap :: (a <-> b) -> (c <-> d) -> p b c -> p a d
dimap f g = (P..) (lmap f) (rmap g)
{-# INLINE dimap #-}
lmap :: (a <-> b) -> p b c -> p a c
lmap f = dimap f id
{-# INLINE lmap #-}
rmap :: (b <-> c) -> p a b -> p a c
rmap = dimap id
{-# INLINE rmap #-}
instance IsoProfunctor (Bijection (->)) where
dimap f g h = g . h . f