{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Network.API.Mandrill.Trans where

import Control.Monad.Reader
import Control.Applicative
import Network.API.Mandrill.Types
import Network.HTTP.Client
import Network.HTTP.Client.TLS


--------------------------------------------------------------------------------
newtype MandrillT m a = MandrillT {
  MandrillT m a -> ReaderT (MandrillKey, Manager) m a
runMandrillT :: ReaderT (MandrillKey, Manager) m a
  } deriving (m a -> MandrillT m a
(forall (m :: * -> *) a. Monad m => m a -> MandrillT m a)
-> MonadTrans MandrillT
forall (m :: * -> *) a. Monad m => m a -> MandrillT m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
lift :: m a -> MandrillT m a
$clift :: forall (m :: * -> *) a. Monad m => m a -> MandrillT m a
MonadTrans, MonadReader (MandrillKey, Manager),
              a -> MandrillT m b -> MandrillT m a
(a -> b) -> MandrillT m a -> MandrillT m b
(forall a b. (a -> b) -> MandrillT m a -> MandrillT m b)
-> (forall a b. a -> MandrillT m b -> MandrillT m a)
-> Functor (MandrillT m)
forall a b. a -> MandrillT m b -> MandrillT m a
forall a b. (a -> b) -> MandrillT m a -> MandrillT m b
forall (m :: * -> *) a b.
Functor m =>
a -> MandrillT m b -> MandrillT m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> MandrillT m a -> MandrillT m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> MandrillT m b -> MandrillT m a
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> MandrillT m b -> MandrillT m a
fmap :: (a -> b) -> MandrillT m a -> MandrillT m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> MandrillT m a -> MandrillT m b
Functor, Functor (MandrillT m)
a -> MandrillT m a
Functor (MandrillT m)
-> (forall a. a -> MandrillT m a)
-> (forall a b.
    MandrillT m (a -> b) -> MandrillT m a -> MandrillT m b)
-> (forall a b c.
    (a -> b -> c) -> MandrillT m a -> MandrillT m b -> MandrillT m c)
-> (forall a b. MandrillT m a -> MandrillT m b -> MandrillT m b)
-> (forall a b. MandrillT m a -> MandrillT m b -> MandrillT m a)
-> Applicative (MandrillT m)
MandrillT m a -> MandrillT m b -> MandrillT m b
MandrillT m a -> MandrillT m b -> MandrillT m a
MandrillT m (a -> b) -> MandrillT m a -> MandrillT m b
(a -> b -> c) -> MandrillT m a -> MandrillT m b -> MandrillT m c
forall a. a -> MandrillT m a
forall a b. MandrillT m a -> MandrillT m b -> MandrillT m a
forall a b. MandrillT m a -> MandrillT m b -> MandrillT m b
forall a b. MandrillT m (a -> b) -> MandrillT m a -> MandrillT m b
forall a b c.
(a -> b -> c) -> MandrillT m a -> MandrillT m b -> MandrillT m c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
forall (m :: * -> *). Applicative m => Functor (MandrillT m)
forall (m :: * -> *) a. Applicative m => a -> MandrillT m a
forall (m :: * -> *) a b.
Applicative m =>
MandrillT m a -> MandrillT m b -> MandrillT m a
forall (m :: * -> *) a b.
Applicative m =>
MandrillT m a -> MandrillT m b -> MandrillT m b
forall (m :: * -> *) a b.
Applicative m =>
MandrillT m (a -> b) -> MandrillT m a -> MandrillT m b
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> MandrillT m a -> MandrillT m b -> MandrillT m c
<* :: MandrillT m a -> MandrillT m b -> MandrillT m a
$c<* :: forall (m :: * -> *) a b.
Applicative m =>
MandrillT m a -> MandrillT m b -> MandrillT m a
*> :: MandrillT m a -> MandrillT m b -> MandrillT m b
$c*> :: forall (m :: * -> *) a b.
Applicative m =>
MandrillT m a -> MandrillT m b -> MandrillT m b
liftA2 :: (a -> b -> c) -> MandrillT m a -> MandrillT m b -> MandrillT m c
$cliftA2 :: forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> MandrillT m a -> MandrillT m b -> MandrillT m c
<*> :: MandrillT m (a -> b) -> MandrillT m a -> MandrillT m b
$c<*> :: forall (m :: * -> *) a b.
Applicative m =>
MandrillT m (a -> b) -> MandrillT m a -> MandrillT m b
pure :: a -> MandrillT m a
$cpure :: forall (m :: * -> *) a. Applicative m => a -> MandrillT m a
$cp1Applicative :: forall (m :: * -> *). Applicative m => Functor (MandrillT m)
Applicative, Applicative (MandrillT m)
a -> MandrillT m a
Applicative (MandrillT m)
-> (forall a b.
    MandrillT m a -> (a -> MandrillT m b) -> MandrillT m b)
-> (forall a b. MandrillT m a -> MandrillT m b -> MandrillT m b)
-> (forall a. a -> MandrillT m a)
-> Monad (MandrillT m)
MandrillT m a -> (a -> MandrillT m b) -> MandrillT m b
MandrillT m a -> MandrillT m b -> MandrillT m b
forall a. a -> MandrillT m a
forall a b. MandrillT m a -> MandrillT m b -> MandrillT m b
forall a b. MandrillT m a -> (a -> MandrillT m b) -> MandrillT m b
forall (m :: * -> *). Monad m => Applicative (MandrillT m)
forall (m :: * -> *) a. Monad m => a -> MandrillT m a
forall (m :: * -> *) a b.
Monad m =>
MandrillT m a -> MandrillT m b -> MandrillT m b
forall (m :: * -> *) a b.
Monad m =>
MandrillT m a -> (a -> MandrillT m b) -> MandrillT m b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> MandrillT m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> MandrillT m a
>> :: MandrillT m a -> MandrillT m b -> MandrillT m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
MandrillT m a -> MandrillT m b -> MandrillT m b
>>= :: MandrillT m a -> (a -> MandrillT m b) -> MandrillT m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
MandrillT m a -> (a -> MandrillT m b) -> MandrillT m b
$cp1Monad :: forall (m :: * -> *). Monad m => Applicative (MandrillT m)
Monad, Monad (MandrillT m)
Monad (MandrillT m)
-> (forall a. IO a -> MandrillT m a) -> MonadIO (MandrillT m)
IO a -> MandrillT m a
forall a. IO a -> MandrillT m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall (m :: * -> *). MonadIO m => Monad (MandrillT m)
forall (m :: * -> *) a. MonadIO m => IO a -> MandrillT m a
liftIO :: IO a -> MandrillT m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> MandrillT m a
$cp1MonadIO :: forall (m :: * -> *). MonadIO m => Monad (MandrillT m)
MonadIO)


--------------------------------------------------------------------------------
type Mandrill = MandrillT IO


--------------------------------------------------------------------------------
runMandrill :: MonadIO m
            => MandrillKey
            -> MandrillT m a
            -> m a
runMandrill :: MandrillKey -> MandrillT m a -> m a
runMandrill MandrillKey
key MandrillT m a
action = do
  Manager
mgr <- IO Manager -> m Manager
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Manager -> m Manager) -> IO Manager -> m Manager
forall a b. (a -> b) -> a -> b
$ ManagerSettings -> IO Manager
newManager ManagerSettings
tlsManagerSettings
  ReaderT (MandrillKey, Manager) m a -> (MandrillKey, Manager) -> m a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (MandrillT m a -> ReaderT (MandrillKey, Manager) m a
forall (m :: * -> *) a.
MandrillT m a -> ReaderT (MandrillKey, Manager) m a
runMandrillT MandrillT m a
action) (MandrillKey
key, Manager
mgr)