@@ -2,6 +2,7 @@
2{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE FunctionalDependencies #-}
3{-# LANGUAGE FunctionalDependencies #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
4{-# LANGUAGE MultiParamTypeClasses #-}
5+{-# LANGUAGE UndecidableInstances #-}
6-- Module: Data.Swagger.Declare
7-- Module: Data.Swagger.Declare
7-- Maintainer: Nickolay Kudasov <nickolay@getshoptv.com>
8-- Maintainer: Nickolay Kudasov <nickolay@getshoptv.com>
@@ -14,7 +15,19 @@ import Prelude ()
14import Prelude.Compat
15import Prelude.Compat
16import Control.Monad
17import Control.Monad
18+import Control.Monad.Cont (ContT)
19+import Control.Monad.List (ListT)
20+import Control.Monad.Reader (ReaderT)
17import Control.Monad.Trans
21import Control.Monad.Trans
22+import Control.Monad.Trans.Except (ExceptT)
23+import Control.Monad.Trans.Identity (IdentityT)
24+import Control.Monad.Trans.Maybe (MaybeT)
25+import Control.Monad.Trans.State.Lazy as Lazy
26+import Control.Monad.Trans.State.Strict as Strict
27+import Control.Monad.Trans.RWS.Lazy as Lazy
28+import Control.Monad.Trans.RWS.Strict as Strict
29+import Control.Monad.Trans.Writer.Lazy as Lazy
30+import Control.Monad.Trans.Writer.Strict as Strict
18import Data.Functor.Identity
31import Data.Functor.Identity
19import Data.Monoid
32import Data.Monoid
@@ -77,6 +90,13 @@ instance (Applicative m, Monad m, Monoid d) => MonadDeclare d (DeclareT d m) whe
77 declare d = DeclareT (\_ -> return (d, ()))
90 declare d = DeclareT (\_ -> return (d, ()))
78 look = DeclareT (\d -> return (mempty, d))
91 look = DeclareT (\d -> return (mempty, d))
93+-- | Lift a computation from the simple Declare monad.
94+liftDeclare :: MonadDeclare d m => Declare d a -> m a
96+ (d', a) <- looks (runDeclare da)
80-- | Retrieve a function of all the output so far.
100-- | Retrieve a function of all the output so far.
81looks :: MonadDeclare d m => (d -> a) -> m a
101looks :: MonadDeclare d m => (d -> a) -> m a
82looks f = f <$> look
102looks f = f <$> look
@@ -125,3 +145,56 @@ execDeclare m = runIdentity . execDeclareT m
125undeclare :: Monoid d => Declare d a -> a
145undeclare :: Monoid d => Declare d a -> a
126undeclare = runIdentity . undeclareT
146undeclare = runIdentity . undeclareT
148+-- ---------------------------------------------------------------------------
149+-- Instances for other mtl transformers
151+-- All of these instances need UndecidableInstances,
152+-- because they do not satisfy the coverage condition.
154+instance MonadDeclare d m => MonadDeclare d (ContT r m) where
155+ declare = lift . declare
158+instance MonadDeclare d m => MonadDeclare d (ExceptT e m) where
159+ declare = lift . declare
162+instance MonadDeclare d m => MonadDeclare d (IdentityT m) where
163+ declare = lift . declare
166+instance MonadDeclare d m => MonadDeclare d (ListT m) where
167+ declare = lift . declare
170+instance MonadDeclare d m => MonadDeclare d (MaybeT m) where
171+ declare = lift . declare
174+instance MonadDeclare d m => MonadDeclare d (ReaderT r m) where
175+ declare = lift . declare
178+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Lazy.RWST r w s m) where
179+ declare = lift . declare
182+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Strict.RWST r w s m) where
183+ declare = lift . declare
186+instance MonadDeclare d m => MonadDeclare d (Lazy.StateT s m) where
187+ declare = lift . declare
190+instance MonadDeclare d m => MonadDeclare d (Strict.StateT s m) where
191+ declare = lift . declare
194+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Lazy.WriterT w m) where
195+ declare = lift . declare
198+instance (Monoid w, MonadDeclare d m) => MonadDeclare d (Strict.WriterT w m) where
199+ declare = lift . declare