{-# 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 {
  runMandrillT :: ReaderT (MandrillKey, Manager) m a
  } deriving (MonadTrans, MonadReader (MandrillKey, Manager),
              Functor, Applicative, Monad, MonadIO)


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


--------------------------------------------------------------------------------
runMandrill :: MonadIO m
            => MandrillKey
            -> MandrillT m a
            -> m a
runMandrill key action = do
  mgr <- liftIO $ newManager tlsManagerSettings
  runReaderT (runMandrillT action) (key, mgr)