{-# LANGUAGE DerivingVia #-}

-- | Concrete reader monad over 'Env'
--
-- Its 'MonadAWS' instance can be used in situations where you don't have or
-- want your own app transformer:
--
-- @
-- import qualified "Amazonka"
-- import "Amazonka.S3"
-- import "Control.Monad.AWS"
--
-- main :: IO ()
-- main = do
--   env <- 'Amazonka.newEnv' 'Amazonka.discover'
--   'runEnvT' someAction env
--
-- someAction :: (MonadIO m, 'MonadAWS' m) => m ()
-- someAction = do
--   resp <- 'send' 'newListBuckets'
--   liftIO $ print resp
-- @
module Control.Monad.AWS.EnvT
  ( EnvT
  , runEnvT
  )
where

import Prelude

import Control.Monad.AWS.Class
import Control.Monad.AWS.ViaReader
import Control.Monad.Reader
import Control.Monad.Trans.Resource

-- |
--
-- @since 0.1.0.0
newtype EnvT m a = EnvT
  { forall (m :: * -> *) a. EnvT m a -> ReaderT Env (ResourceT m) a
unEnvT :: ReaderT Env (ResourceT m) a
  }
  deriving newtype
    ( forall a b. a -> EnvT m b -> EnvT m a
forall a b. (a -> b) -> EnvT m a -> EnvT m b
forall (m :: * -> *) a b. Functor m => a -> EnvT m b -> EnvT m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> EnvT m a -> EnvT m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> EnvT m b -> EnvT m a
$c<$ :: forall (m :: * -> *) a b. Functor m => a -> EnvT m b -> EnvT m a
fmap :: forall a b. (a -> b) -> EnvT m a -> EnvT m b
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> EnvT m a -> EnvT m b
Functor
    , forall a. a -> EnvT m a
forall a b. EnvT m a -> EnvT m b -> EnvT m a
forall a b. EnvT m a -> EnvT m b -> EnvT m b
forall a b. EnvT m (a -> b) -> EnvT m a -> EnvT m b
forall a b c. (a -> b -> c) -> EnvT m a -> EnvT m b -> EnvT 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 (EnvT m)
forall (m :: * -> *) a. Applicative m => a -> EnvT m a
forall (m :: * -> *) a b.
Applicative m =>
EnvT m a -> EnvT m b -> EnvT m a
forall (m :: * -> *) a b.
Applicative m =>
EnvT m a -> EnvT m b -> EnvT m b
forall (m :: * -> *) a b.
Applicative m =>
EnvT m (a -> b) -> EnvT m a -> EnvT m b
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> EnvT m a -> EnvT m b -> EnvT m c
<* :: forall a b. EnvT m a -> EnvT m b -> EnvT m a
$c<* :: forall (m :: * -> *) a b.
Applicative m =>
EnvT m a -> EnvT m b -> EnvT m a
*> :: forall a b. EnvT m a -> EnvT m b -> EnvT m b
$c*> :: forall (m :: * -> *) a b.
Applicative m =>
EnvT m a -> EnvT m b -> EnvT m b
liftA2 :: forall a b c. (a -> b -> c) -> EnvT m a -> EnvT m b -> EnvT m c
$cliftA2 :: forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> EnvT m a -> EnvT m b -> EnvT m c
<*> :: forall a b. EnvT m (a -> b) -> EnvT m a -> EnvT m b
$c<*> :: forall (m :: * -> *) a b.
Applicative m =>
EnvT m (a -> b) -> EnvT m a -> EnvT m b
pure :: forall a. a -> EnvT m a
$cpure :: forall (m :: * -> *) a. Applicative m => a -> EnvT m a
Applicative
    , forall a. a -> EnvT m a
forall a b. EnvT m a -> EnvT m b -> EnvT m b
forall a b. EnvT m a -> (a -> EnvT m b) -> EnvT m b
forall {m :: * -> *}. Monad m => Applicative (EnvT m)
forall (m :: * -> *) a. Monad m => a -> EnvT m a
forall (m :: * -> *) a b.
Monad m =>
EnvT m a -> EnvT m b -> EnvT m b
forall (m :: * -> *) a b.
Monad m =>
EnvT m a -> (a -> EnvT m b) -> EnvT 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 :: forall a. a -> EnvT m a
$creturn :: forall (m :: * -> *) a. Monad m => a -> EnvT m a
>> :: forall a b. EnvT m a -> EnvT m b -> EnvT m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
EnvT m a -> EnvT m b -> EnvT m b
>>= :: forall a b. EnvT m a -> (a -> EnvT m b) -> EnvT m b
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
EnvT m a -> (a -> EnvT m b) -> EnvT m b
Monad
    , forall a. IO a -> EnvT m a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
forall {m :: * -> *}. MonadIO m => Monad (EnvT m)
forall (m :: * -> *) a. MonadIO m => IO a -> EnvT m a
liftIO :: forall a. IO a -> EnvT m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> EnvT m a
MonadIO
    , forall b. ((forall a. EnvT m a -> IO a) -> IO b) -> EnvT m b
forall (m :: * -> *).
MonadIO m
-> (forall b. ((forall a. m a -> IO a) -> IO b) -> m b)
-> MonadUnliftIO m
forall {m :: * -> *}. MonadUnliftIO m => MonadIO (EnvT m)
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. EnvT m a -> IO a) -> IO b) -> EnvT m b
withRunInIO :: forall b. ((forall a. EnvT m a -> IO a) -> IO b) -> EnvT m b
$cwithRunInIO :: forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. EnvT m a -> IO a) -> IO b) -> EnvT m b
MonadUnliftIO
    , forall a. ResourceT IO a -> EnvT m a
forall (m :: * -> *). MonadIO m => MonadIO (EnvT m)
forall (m :: * -> *).
MonadIO m -> (forall a. ResourceT IO a -> m a) -> MonadResource m
forall (m :: * -> *) a. MonadIO m => ResourceT IO a -> EnvT m a
liftResourceT :: forall a. ResourceT IO a -> EnvT m a
$cliftResourceT :: forall (m :: * -> *) a. MonadIO m => ResourceT IO a -> EnvT m a
MonadResource
    , MonadReader Env
    )
  deriving (forall a.
(AWSRequest a, Typeable a, Typeable (AWSResponse a)) =>
a -> EnvT m (Either Error (AWSResponse a))
forall a.
(AWSRequest a, Typeable a) =>
Wait a -> a -> EnvT m (Either Error Accept)
forall a. (Env -> Env) -> EnvT m a -> EnvT m a
forall a. (AuthEnv -> EnvT m a) -> EnvT m a
forall (m :: * -> *).
Monad m
-> (forall a.
    (AWSRequest a, Typeable a, Typeable (AWSResponse a)) =>
    a -> m (Either Error (AWSResponse a)))
-> (forall a.
    (AWSRequest a, Typeable a) =>
    Wait a -> a -> m (Either Error Accept))
-> (forall a. (AuthEnv -> m a) -> m a)
-> (forall a. (Env -> Env) -> m a -> m a)
-> MonadAWS m
forall {m :: * -> *}. MonadIO m => Monad (EnvT m)
forall (m :: * -> *) a.
(MonadIO m, AWSRequest a, Typeable a, Typeable (AWSResponse a)) =>
a -> EnvT m (Either Error (AWSResponse a))
forall (m :: * -> *) a.
(MonadIO m, AWSRequest a, Typeable a) =>
Wait a -> a -> EnvT m (Either Error Accept)
forall (m :: * -> *) a.
MonadIO m =>
(Env -> Env) -> EnvT m a -> EnvT m a
forall (m :: * -> *) a.
MonadIO m =>
(AuthEnv -> EnvT m a) -> EnvT m a
localEnv :: forall a. (Env -> Env) -> EnvT m a -> EnvT m a
$clocalEnv :: forall (m :: * -> *) a.
MonadIO m =>
(Env -> Env) -> EnvT m a -> EnvT m a
withAuth :: forall a. (AuthEnv -> EnvT m a) -> EnvT m a
$cwithAuth :: forall (m :: * -> *) a.
MonadIO m =>
(AuthEnv -> EnvT m a) -> EnvT m a
awaitEither :: forall a.
(AWSRequest a, Typeable a) =>
Wait a -> a -> EnvT m (Either Error Accept)
$cawaitEither :: forall (m :: * -> *) a.
(MonadIO m, AWSRequest a, Typeable a) =>
Wait a -> a -> EnvT m (Either Error Accept)
sendEither :: forall a.
(AWSRequest a, Typeable a, Typeable (AWSResponse a)) =>
a -> EnvT m (Either Error (AWSResponse a))
$csendEither :: forall (m :: * -> *) a.
(MonadIO m, AWSRequest a, Typeable a, Typeable (AWSResponse a)) =>
a -> EnvT m (Either Error (AWSResponse a))
MonadAWS) via (ReaderAWS (EnvT m))

-- |
--
-- @since 0.1.0.0
runEnvT :: MonadUnliftIO m => EnvT m a -> Env -> m a
runEnvT :: forall (m :: * -> *) a. MonadUnliftIO m => EnvT m a -> Env -> m a
runEnvT EnvT m a
f = forall (m :: * -> *) a. MonadUnliftIO m => ResourceT m a -> m a
runResourceT forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (forall (m :: * -> *) a. EnvT m a -> ReaderT Env (ResourceT m) a
unEnvT EnvT m a
f)