12345678910111213141516171819202122232425262728293031323334 |
- {-# LANGUAGE TypeFamilies #-}
- module Control.Monad.Trans.Interruptible.Class where
- import Control.Monad.Trans.Class
- import Control.Monad.Trans.Either
- class MonadTrans t => Interruptible t where
- type RSt t :: * -> *
- resume :: Monad m => (a -> t m b) -> RSt t a -> m (RSt t b)
- instance Interruptible (EitherT e) where
- type RSt (EitherT e) = Either e
- resume f st = runEitherT (hoistEither st >>= f)
- 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
|