module Control.Monad.Trans.Interruptible.Class (
Interruptible(..),
resume2,
resume3,
resume4,
resume5
)where
import Control.Monad.Trans.Class
import Control.Monad.Trans.State
import Control.Monad.Trans.Either
class MonadTrans t => Interruptible t where
type RSt t a :: *
resume :: Monad m => (a -> t m b) -> RSt t a -> m (RSt t b)
instance Interruptible (EitherT e) where
type RSt (EitherT e) a = Either e a
resume f st = runEitherT (hoistEither st >>= f)
instance Interruptible (StateT st) where
type RSt (StateT st) a = (a, st)
resume f (a, st) = runStateT (f a) st
resume2 :: (Monad m, Interruptible t, Monad (t m), Interruptible u) =>
(a -> u (t m) b) -> RSt t (RSt u a) -> m (RSt t (RSt u b))
resume2 = resume.resume
resume3 :: (Monad m, Interruptible t0, Monad (t0 m), Interruptible t1,
Monad (t1 (t0 m)), Interruptible t2) =>
(a -> t2 (t1 (t0 m)) b) -> RSt t0 (RSt t1 (RSt t2 a)) ->
m (RSt t0 (RSt t1 (RSt t2 b)))
resume3 = resume2.resume
resume4 :: (Monad m, Interruptible t0, Interruptible t1, Interruptible t2,
Interruptible t3, Monad (t0 m), Monad (t1 (t0 m)), Monad (t2 (t1 (t0 m)))) =>
(a -> t3 (t2 (t1 (t0 m))) b) -> RSt t0 (RSt t1 (RSt t2 (RSt t3 a))) ->
m (RSt t0 (RSt t1 (RSt t2 (RSt t3 b))))
resume4 = resume3.resume
resume5 :: (Monad m, Interruptible t0, Interruptible t1, Interruptible t2,
Interruptible t3, Interruptible t4, Monad (t0 m), Monad (t1 (t0 m)),
Monad (t2 (t1 (t0 m))), Monad (t3 (t2 (t1 (t0 m))))) =>
(a -> t4 (t3 (t2 (t1 (t0 m)))) b) -> RSt t0 (RSt t1 (RSt t2 (RSt t3 (RSt t4 a)))) ->
m (RSt t0 (RSt t1 (RSt t2 (RSt t3 (RSt t4 b)))))
resume5 = resume4.resume