module Data.Profunctor.Monadic
(
Monadic
, (>>=)
, (>>)
, return
, fail
) where
import Data.Profunctor
import Prelude hiding ((>>=), (>>))
type Monadic p = (Profunctor p, forall x. Monad (p x))
(>>=) :: Monadic p => p a b -> (b -> p c d) -> p (a,c) (b,d)
infixl 1 >>=
p a b
p >>= :: forall (p :: * -> * -> *) a b c d.
Monadic p =>
p a b -> (b -> p c d) -> p (a, c) (b, d)
>>= b -> p c d
f = do
b
b <- ((a, c) -> a) -> p a b -> p (a, c) b
forall a b c. (a -> b) -> p b c -> p a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (a, c) -> a
forall a b. (a, b) -> a
fst p a b
p
d
d <- ((a, c) -> c) -> p c d -> p (a, c) d
forall a b c. (a -> b) -> p b c -> p a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (a, c) -> c
forall a b. (a, b) -> b
snd (b -> p c d
f b
b)
(b, d) -> p (a, c) (b, d)
forall a. a -> p (a, c) a
forall (m :: * -> *) a. Monad m => a -> m a
return (b
b,d
d)
(>>) :: Monadic p => p () c -> p a b -> p a b
infixl 1 >>
p () c
x >> :: forall (p :: * -> * -> *) c a b.
Monadic p =>
p () c -> p a b -> p a b
>> p a b
y = do c
_ <- (a -> ()) -> p () c -> p a c
forall a b c. (a -> b) -> p b c -> p a c
forall (p :: * -> * -> *) a b c.
Profunctor p =>
(a -> b) -> p b c -> p a c
lmap (() -> a -> ()
forall a b. a -> b -> a
const ()) p () c
x; p a b
y