1 module Control.Monad.X.ResumeT
7 import Prelude(Functor(..),Monad(..),error)
8 import Control.Monad(liftM,MonadPlus(..))
10 import Control.Monad.X.Trans as T
11 import Control.Monad.X.Utils
12 import Control.Monad.X.Types (ResumeT(..), Res(..))
15 -- a transformer for explicit "lazyness"
18 instance MonadTrans ResumeT where
19 lift m = Re (liftM Value m)
21 instance Monad m => Functor (ResumeT m) where
24 instance Monad m => Monad (ResumeT m) where
26 m >>= f = Re (do x <- unRe m
29 Delay m -> return (Delay (m >>= f)))
31 instance HasBaseMonad m n => HasBaseMonad (ResumeT m) n where
34 instance Monad m => Functor (Res m) where
35 fmap f (Value a) = Value (f a)
36 fmap f (Delay m) = Delay (liftM f m)
40 hyper :: Monad m => ResumeT m a -> m a
41 hyper m = do x <- unRe m
46 mapResumeT f m = Re (f (unRe m))
48 instance MonadReader r m => MonadReader r (ResumeT m) where
50 local = local' mapResumeT
52 instance MonadWriter w m => MonadWriter w (ResumeT m) where
54 listen = listen1' Re unRe (\w -> fmap (\a -> (a,w)))
56 instance MonadState s m => MonadState s (ResumeT m) where
60 instance MonadError e m => MonadError e (ResumeT m) where
61 throwError = throwError'
62 catchError = catchError1' Re unRe
64 instance MonadPlus m => MonadPlus (ResumeT m) where
66 mplus = mplus1' Re unRe
68 instance MonadNondet m => MonadNondet (ResumeT m) where
69 findAll = error "findAll ResumeT TODO"
70 commit = mapResumeT commit
72 instance Monad m => MonadResume (ResumeT m) where
73 delay m = Re (return (Delay m))
74 force m = Re (do x <- unRe m
76 Value a -> return (Value a)
79 instance MonadCont m => MonadCont (ResumeT m) where
80 callCC = callCC1' Re unRe Value