1 -----------------------------------------------------------------------------
3 -- Module : Control.Monad.Cont
4 -- Copyright : (c) The University of Glasgow 2001
5 -- License : BSD-style (see the file libraries/base/LICENSE)
7 -- Maintainer : libraries@haskell.org
8 -- Stability : experimental
9 -- Portability : non-portable (multi-parameter type classes)
11 -- Continuation monads.
13 -----------------------------------------------------------------------------
15 module Control.Monad.X.ContT (
24 import Prelude (Functor(..),Monad(..),(.),fst,error)
25 import Control.Monad(liftM,MonadPlus(..))
27 import Control.Monad.X.Trans as T
28 import Control.Monad.X.Utils
29 import Control.Monad.X.Types(ContT(..))
35 instance MonadTrans (ContT r) where
38 instance HasBaseMonad m n => HasBaseMonad (ContT r m) n where
41 instance (Monad m) => Functor (ContT r m) where
44 instance (Monad m) => Monad (ContT r m) where
46 m >>= k = C (\c -> m $$ (\a -> k a $$ c))
49 runCont :: Monad m => ContT r m r -> m r
50 runCont m = m $$ return
54 mapContT :: (m r -> m r) -> ContT r m a -> ContT r m a
55 mapContT f m = C (f . (m $$))
57 withContT :: ((b -> m r) -> (a -> m r)) -> ContT r m a -> ContT r m b
58 withContT f m = C ((m $$) . f)
62 -- (a -> (e -> m a)) -> e -> m a
64 instance (MonadReader r' m) => MonadReader r' (ContT r m) where
66 local f m = C (\k -> do r <- ask
67 local f (m $$ (\a -> localSet r (k a))))
70 instance (MonadWriter w m) => MonadWriter w (ContT r m) where
72 listen = error "listen: continuations after writer not implemenetd (yet?)"
74 instance (MonadState s m) => MonadState s (ContT r m) where
78 instance (MonadError e m) => MonadError e (ContT r m) where
79 throwError = throwError'
80 catchError = catchError2' C ($$)
82 instance MonadPlus m => MonadPlus (ContT r m) where
84 mplus = mplus2' C ($$)
86 instance (Monad m) => MonadCont (ContT r m) where
87 callCC f = C (\c -> f (\a -> C (\_ -> c a)) $$ c)