0 | module Control.Monad.Restricted
 1 |
 2 | import Control.Applicative.Restricted
 3 | import Data.Functor.Restricted
 4 |
 5 |
 6 | export infixl 1 =<<
 7 | export infixl 1 >=>
 8 | export infixl 1 <=<
 9 |
10 |
11 | public export
12 | interface RApplicative r m => RMonad (0 r : Type -> Type) (0 m : Type -> Type) where
13 |   rjoin : (r x, r y) => m x -> (x -> m y) -> m y
14 |
15 | export
16 | (>>=) : {0 m : Type -> Type} -> (RMonad r m) => (r x, r y) => m x -> (x -> m y) -> m y
17 | (>>=) = rjoin
18 |
19 | export
20 | (=<<) : (RMonad r m) => (r x, r y) => (x -> m y) -> m x -> m y
21 | f =<< a = a >>= f
22 |
23 | export
24 | (<=<) : (RMonad r m) => (r x, r y, r z) => (y -> m z) -> (x -> m y) -> x -> m z
25 | (g <=< f) x = g =<< f x
26 |
27 | export
28 | (>=>) : (RMonad r m) => (r x, r y, r z) => (x -> m y) -> (y -> m z) -> x -> m z
29 | f >=> g = g <=< f
30 |