started with new typechecker
[cc1516.git] / RWST.dcl
1 definition module RWST
2
3 from Control.Applicative import class Applicative
4 from Control.Monad import class Monad
5 from Data.Void import :: Void
6 from Data.Functor import class Functor
7 from Data.Functor.Identity import :: Identity
8 from Data.Monoid import class Monoid, class Semigroup
9
10 // The RWS monad
11 :: RWS r w s a :== RWST r w s Identity a
12
13 rws :: (r -> s -> (a, s, w)) -> RWS r w s a
14 runRWS :: (RWS r w s a) r s -> (a, s, w)
15 evalRWS :: (RWS r w s a) r s -> (a, w)
16 execRWS :: (RWS r w s a) r s -> (s, w)
17 mapRWS :: ((a, s, w) -> (b, s, w`)) (RWS r w s a) -> RWS r w` s b
18 withRWS :: (r` s -> (r, s)) (RWS r w s a) -> RWS r` w s a
19
20 // The RWST monad transformer
21 :: RWST r w s m a = RWST (r s -> m (a, s, w))
22
23 instance Functor (RWST r w s m) | Monad m & Monoid w
24 instance Applicative (RWST r w s m) | Monad m & Monoid w
25 instance Monad (RWST r w s m) | Monad m & Monoid w
26
27 runRWST :: (RWST r w s m a) r s -> m (a, s, w)
28 evalRWST :: (RWST r w s m a) r s -> m (a, w) | Monad m
29 execRWST :: (RWST r w s m a) r s -> m (s, w) | Monad m
30 mapRWST :: ((m (a, s, w)) -> n (b, s, w`)) (RWST r w s m a) -> RWST r w` s n b
31 withRWST :: (r` -> s -> (r, s)) (RWST r w s m a) -> RWST r` w s m a
32
33 // Reader operations
34 ask :: RWST r w s m r | Monoid w & Monad m
35 local :: (r -> r) (RWST r w s m a) -> RWST r w s m a | Monoid w & Monad m
36 asks :: (r -> a) -> RWST r w s m a | Monoid w & Monad m
37
38 // Writer operations
39 tell :: w -> RWST r w s m Void | Monoid w & Monad m
40 listen :: (RWST r w s m a) -> RWST r w s m (a, w) | Monoid w & Monad m
41 pass :: (RWST r w s m (a, w -> w)) -> RWST r w s m a | Monoid w & Monad m
42 listens :: (w -> b) (RWST r w s m a) -> RWST r w s m (a, b)| Monoid w & Monad m
43 censor :: (w -> w) (RWST r w s m a) -> RWST r w s m a | Monoid w & Monad m
44
45 // State operations
46 get :: RWST r w s m s | Monoid w & Monad m
47 put :: s -> RWST r w s m Void | Monoid w & Monad m
48 modify :: (s -> s) -> RWST r w s m Void | Monoid w & Monad m
49 gets :: (s -> a) -> RWST r w s m a | Monoid w & Monad m
50
51 // Lifting other operations
52 liftCallCC :: ((((a,s,w) -> m (b,s,w)) -> m (a,s,w)) -> m (a,s,w)) ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a | Monoid w
53 liftCallCC` :: ((((a,s,w) -> m (b,s,w)) -> m (a,s,w)) -> m (a,s,w)) ((a -> RWST r w s m b) -> RWST r w s m a) -> RWST r w s m a | Monoid w
54 liftCatch :: ((m (a,s,w)) (e -> m (a,s,w)) -> m (a,s,w)) (RWST l w s m a) (e -> RWST l w s m a) -> RWST l w s m a