invertible-0.2.0: Data/Invertible/Monad.hs
-- |
-- Using bijections with monads.
{-# LANGUAGE Safe, TypeOperators #-}
module Data.Invertible.Monad
( bind
, (=<<->>=)
, liftM
) where
import qualified Control.Monad as M
import Data.Invertible.Bijection
-- |Bind two functions to create a "Control.Invertible.MonadArrow"-form bijection.
bind :: Monad m => (a -> m b) -> (b -> m a) -> m a <-> m b
bind f g = (f =<<) :<->: (g =<<)
-- |Crazy operator form of 'bind'.
(=<<->>=) :: Monad m => (a -> m b) -> (b -> m a) -> m a <-> m b
(=<<->>=) = bind
infix 2 =<<->>=
-- |Promote a bijection to a "Control.Invertible.MonadArrow"-form bijection.
-- (Equivalent to 'Data.Invertible.Functor.bifmap' and 'Control.Invertible.BiArrow.biarr'.)
liftM :: Monad m => a <-> b -> m a <-> m b
liftM (f :<->: g) = M.liftM f :<->: M.liftM g