@@ -0,0 +1,52 @@
1+{-# LANGUAGE RankNTypes #-}
2+{-# LANGUAGE DefaultSignatures #-}
3+module Control.Monad.Trans.Lift.Local
4+ ( LiftLocal(..)
5+ , Local
6+ ) where
7+
8+import Control.Monad.Trans.Class
9+import Control.Monad.Morph
10+
11+import Control.Monad.Trans.Except
12+import Control.Monad.Trans.Identity
13+import Control.Monad.Trans.List
14+import Control.Monad.Trans.Maybe
15+import Control.Monad.Trans.Reader
16+import qualified Control.Monad.Trans.Cont as Cont
17+import qualified Control.Monad.Trans.RWS.Lazy as Lazy
18+import qualified Control.Monad.Trans.RWS.Strict as Strict
19+import qualified Control.Monad.Trans.State.Lazy as Lazy
20+import qualified Control.Monad.Trans.State.Strict as Strict
21+import qualified Control.Monad.Trans.Writer.Lazy as Lazy
22+import qualified Control.Monad.Trans.Writer.Strict as Strict
23+
24+type Local r m a = (r -> r) -> m a -> m a
25+
26+class MonadTrans t => LiftLocal t where
27+ liftLocal
28+ :: Monad m
29+ => m r
30+ -> (forall a . Local r m a)
31+ -> (forall a . Local r (t m) a)
32+ default liftLocal
33+ :: (Monad m, MFunctor t)
34+ => m r
35+ -> (forall a . Local r m a)
36+ -> (forall a . Local r (t m) a)
37+ liftLocal _ l f = hoist (l f)
38+
39+instance LiftLocal (Cont.ContT r)
40+ where liftLocal = Cont.liftLocal
41+
42+instance LiftLocal (ExceptT e)
43+instance LiftLocal IdentityT
44+instance LiftLocal ListT
45+instance LiftLocal MaybeT
46+instance LiftLocal (ReaderT r)
47+instance Monoid w => LiftLocal (Lazy.RWST r w s)
48+instance Monoid w => LiftLocal (Strict.RWST r w s)
49+instance LiftLocal (Lazy.StateT s)
50+instance LiftLocal (Strict.StateT s)
51+instance Monoid w => LiftLocal (Lazy.WriterT w)
52+instance Monoid w => LiftLocal (Strict.WriterT w)