Class.hs 1.5 KB

12345678910111213141516171819202122232425262728293031323334
  1. {-# LANGUAGE TypeFamilies #-}
  2. module Control.Monad.Trans.Interruptible.Class where
  3. import Control.Monad.Trans.Class
  4. import Control.Monad.Trans.Either
  5. class MonadTrans t => Interruptible t where
  6. type RSt t :: * -> *
  7. resume :: Monad m => (a -> t m b) -> RSt t a -> m (RSt t b)
  8. instance Interruptible (EitherT e) where
  9. type RSt (EitherT e) = Either e
  10. resume f st = runEitherT (hoistEither st >>= f)
  11. resume2 :: (Monad m, Interruptible t, Monad (t m), Interruptible u) =>
  12. (a -> u (t m) b) -> RSt t (RSt u a) -> m (RSt t (RSt u b))
  13. resume2 = resume.resume
  14. resume3 :: (Monad m, Interruptible t0, Monad (t0 m), Interruptible t1,
  15. Monad (t1 (t0 m)), Interruptible t2) =>
  16. (a -> t2 (t1 (t0 m)) b) -> RSt t0 (RSt t1 (RSt t2 a)) ->
  17. m (RSt t0 (RSt t1 (RSt t2 b)))
  18. resume3 = resume2.resume
  19. resume4 :: (Monad m, Interruptible t0, Interruptible t1, Interruptible t2,
  20. Interruptible t3, Monad (t0 m), Monad (t1 (t0 m)), Monad (t2 (t1 (t0 m)))) =>
  21. (a -> t3 (t2 (t1 (t0 m))) b) -> RSt t0 (RSt t1 (RSt t2 (RSt t3 a))) ->
  22. m (RSt t0 (RSt t1 (RSt t2 (RSt t3 b))))
  23. resume4 = resume3.resume
  24. resume5 :: (Monad m, Interruptible t0, Interruptible t1, Interruptible t2,
  25. Interruptible t3, Interruptible t4, Monad (t0 m), Monad (t1 (t0 m)),
  26. Monad (t2 (t1 (t0 m))), Monad (t3 (t2 (t1 (t0 m))))) =>
  27. (a -> t4 (t3 (t2 (t1 (t0 m)))) b) -> RSt t0 (RSt t1 (RSt t2 (RSt t3 (RSt t4 a)))) ->
  28. m (RSt t0 (RSt t1 (RSt t2 (RSt t3 (RSt t4 b)))))
  29. resume5 = resume4.resume