@@ -1,10 +1,11 @@
11{-# LANGUAGE CPP #-}
22{-# LANGUAGE TypeFamilies #-}
3+{-# LANGUAGE RankNTypes #-}
34{-# LANGUAGE UndecidableInstances #-}
4−{-# LANGUAGE DefaultSignatures #-}
55module Control.Monad.Trans.Lift.Catch
66 ( LiftCatch(..)
77 , Catch
8+ , defaultLiftCatch
89 , module Control.Monad.Trans.Class
910 ) where
1011
@@ -14,39 +15,60 @@ import Data.Monoid
1415
1516import Control.Monad.Signatures
1617import Control.Monad.Trans.Class
17−import Control.Monad.Trans.Control
18−
19−import Control.Monad.Trans.Except
20−import Control.Monad.Trans.Identity
21−import Control.Monad.Trans.List
22−import Control.Monad.Trans.Maybe
23−import Control.Monad.Trans.Reader
24−import qualified Control.Monad.Trans.RWS.Lazy as Lazy
25−import qualified Control.Monad.Trans.RWS.Strict as Strict
26−import qualified Control.Monad.Trans.State.Lazy as Lazy
27−import qualified Control.Monad.Trans.State.Strict as Strict
28−import qualified Control.Monad.Trans.Writer.Lazy as Lazy
29−import qualified Control.Monad.Trans.Writer.Strict as Strict
18+
19+import qualified Control.Monad.Trans.Except as E
20+import qualified Control.Monad.Trans.Identity as I
21+import qualified Control.Monad.Trans.List as L
22+import qualified Control.Monad.Trans.Maybe as M
23+import qualified Control.Monad.Trans.Reader as R
24+import qualified Control.Monad.Trans.RWS.Lazy as RWS.Lazy
25+import qualified Control.Monad.Trans.RWS.Strict as RWS.Strict
26+import qualified Control.Monad.Trans.State.Lazy as S.Lazy
27+import qualified Control.Monad.Trans.State.Strict as S.Strict
28+import qualified Control.Monad.Trans.Writer.Lazy as W.Lazy
29+import qualified Control.Monad.Trans.Writer.Strict as W.Strict
30+
31+import Control.Monad.Trans.Lift.StT
3032
3133class MonadTrans t => LiftCatch t where
32− type CatchStT t a
33− type CatchStT t a = StT t a
34− liftCatch :: Monad m => Catch e m (CatchStT t a) -> Catch e (t m) a
35− default liftCatch
36− :: (MonadTransControl t, CatchStT t a ~ StT t a, Monad m, Monad (t m))
37− => Catch e m (CatchStT t a) -> Catch e (t m) a
38− liftCatch catch m h = do
39− st <- liftWith (\run -> catch (run m) (run . h))
40− restoreT (return st)
41−
42−instance LiftCatch (ExceptT e)
43−instance LiftCatch IdentityT
44−instance LiftCatch ListT
45−instance LiftCatch MaybeT
46−instance LiftCatch (ReaderT r)
47−instance Monoid w => LiftCatch (Lazy.RWST r w s)
48−instance Monoid w => LiftCatch (Strict.RWST r w s)
49−instance LiftCatch (Lazy.StateT s)
50−instance LiftCatch (Strict.StateT s)
51−instance Monoid w => LiftCatch (Lazy.WriterT w)
52−instance Monoid w => LiftCatch (Strict.WriterT w)
34+ liftCatch :: Monad m => Catch e m (StT t a) -> Catch e (t m) a
35+
36+defaultLiftCatch
37+ :: (Monad m, LiftCatch n)
38+ => (forall x . n m x -> t m x)
39+ -> (forall o x . t o x -> n o x)
40+ -> Catch e m (StT n a) -> Catch e (t m) a
41+defaultLiftCatch t unT f m h = t $ liftCatch f (unT m) (unT . h)
42+
43+instance LiftCatch (E.ExceptT e) where
44+ liftCatch f m h = E.ExceptT $ f (E.runExceptT m) (E.runExceptT . h)
45+
46+instance LiftCatch I.IdentityT where
47+ liftCatch = I.liftCatch
48+
49+instance LiftCatch L.ListT where
50+ liftCatch = L.liftCatch
51+
52+instance LiftCatch M.MaybeT where
53+ liftCatch = M.liftCatch
54+
55+instance LiftCatch (R.ReaderT r) where
56+ liftCatch = R.liftCatch
57+
58+instance Monoid w => LiftCatch (RWS.Lazy.RWST r w s) where
59+ liftCatch = RWS.Lazy.liftCatch
60+
61+instance Monoid w => LiftCatch (RWS.Strict.RWST r w s) where
62+ liftCatch = RWS.Strict.liftCatch
63+
64+instance LiftCatch (S.Lazy.StateT s) where
65+ liftCatch = S.Lazy.liftCatch
66+
67+instance LiftCatch (S.Strict.StateT s) where
68+ liftCatch = S.Strict.liftCatch
69+
70+instance Monoid w => LiftCatch (W.Lazy.WriterT w) where
71+ liftCatch = W.Lazy.liftCatch
72+
73+instance Monoid w => LiftCatch (W.Strict.WriterT w) where
74+ liftCatch = W.Strict.liftCatch