@@ -1,3 +1,11 @@
1+{-# LANGUAGE FlexibleContexts #-}
2+{-# LANGUAGE FlexibleInstances #-}
3+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
4+{-# LANGUAGE MultiParamTypeClasses #-}
5+{-# LANGUAGE ScopedTypeVariables #-}
6+{-# LANGUAGE TypeFamilies #-}
7+{-# LANGUAGE UndecidableInstances #-}
2-- Module : Network.Google
10-- Module : Network.Google
3-- Copyright : (c) 2015 Brendan Hay
11-- Copyright : (c) 2015 Brendan Hay
@@ -8,4 +16,89 @@
9module Network.Google where
17module Network.Google where
19+import Control.Applicative
21+import Control.Monad.Base
22+import Control.Monad.Catch
23+import Control.Monad.IO.Class (MonadIO)
24+import Control.Monad.Reader
25+import qualified Control.Monad.RWS.Lazy as LRW
26+import qualified Control.Monad.RWS.Strict as RW
27+import qualified Control.Monad.State.Lazy as LS
28+import qualified Control.Monad.State.Strict as S
29+import Control.Monad.Trans.Class (lift)
30+import Control.Monad.Trans.Control
31+import Control.Monad.Trans.Except (ExceptT)
32+import Control.Monad.Trans.Identity (IdentityT)
33+import Control.Monad.Trans.List (ListT)
34+import Control.Monad.Trans.Maybe (MaybeT)
35+import Control.Monad.Trans.Resource
36+import qualified Control.Monad.Writer.Lazy as LW
37+import qualified Control.Monad.Writer.Strict as W
38+import Network.Google.Auth
39+import Network.Google.Env
11−import Network.Google.Prelude ()
40+import Network.Google.Prelude
42+newtype Google a = Google { unGoogle :: ReaderT Env (ResourceT IO) a }
58+instance MonadBaseControl IO Google where
59+ type StM Google a = StM (ReaderT Env (ResourceT IO)) a
61+ liftBaseWith f = Google . liftBaseWith $ \g -> f (g . unGoogle)
62+ restoreM = Google . restoreM
64+-- | Monads in which 'Google' actions may be embedded.
70+ ) => MonadGoogle m where
71+ -- | Lift a computation to the 'Google' monad.
72+ liftGoogle :: Google a -> m a
74+instance MonadGoogle Google where
77+instance MonadGoogle m => MonadGoogle (IdentityT m) where liftGoogle = lift . liftGoogle
78+instance MonadGoogle m => MonadGoogle (ListT m) where liftGoogle = lift . liftGoogle
79+instance MonadGoogle m => MonadGoogle (MaybeT m) where liftGoogle = lift . liftGoogle
80+instance MonadGoogle m => MonadGoogle (ExceptT e m) where liftGoogle = lift . liftGoogle
81+instance MonadGoogle m => MonadGoogle (ReaderT r m) where liftGoogle = lift . liftGoogle
82+instance MonadGoogle m => MonadGoogle (S.StateT s m) where liftGoogle = lift . liftGoogle
83+instance MonadGoogle m => MonadGoogle (LS.StateT s m) where liftGoogle = lift . liftGoogle
85+instance (Monoid w, MonadGoogle m) => MonadGoogle (W.WriterT w m) where
86+ liftGoogle = lift . liftGoogle
88+instance (Monoid w, MonadGoogle m) => MonadGoogle (LW.WriterT w m) where
89+ liftGoogle = lift . liftGoogle
91+instance (Monoid w, MonadGoogle m) => MonadGoogle (RW.RWST r w s m) where
92+ liftGoogle = lift . liftGoogle
94+instance (Monoid w, MonadGoogle m) => MonadGoogle (LRW.RWST r w s m) where
95+ liftGoogle = lift . liftGoogle
97+runGoogle :: MonadResource m => Env -> Google a -> m a
98+runGoogle e m = liftResourceT $ runReaderT (unGoogle m) e -- (e ^. environment)
100+send :: GoogleRequest a => a -> m (Rs a)
103+download :: GoogleRequest (MediaDownload a) => a -> m (Rs (MediaDownload a))
104+download = send . MediaDownload