{-# LANGUAGE UndecidableInstances #-}
module Control.Monad.AWS.ViaReader
( Env
, HasEnv (..)
, ReaderAWS (..)
) where
import Prelude
import qualified Amazonka.Auth as Amazonka
import Amazonka.Env
import qualified Amazonka.Send as Amazonka
import Control.Lens (Lens', to, view, (%~))
import Control.Monad.AWS.Class
import Control.Monad.Reader
import Control.Monad.Trans.Resource (MonadResource)
import Data.Functor.Identity (runIdentity)
class HasEnv env where
envL :: Lens' env Env
instance HasEnv Env where
envL :: Lens' Env Env
envL = (Env -> f Env) -> Env -> f Env
forall a. a -> a
id
newtype ReaderAWS m a = ReaderAWS
{ forall (m :: * -> *) a. ReaderAWS m a -> m a
unReaderAWS :: m a
}
deriving newtype
( (forall a b. (a -> b) -> ReaderAWS m a -> ReaderAWS m b)
-> (forall a b. a -> ReaderAWS m b -> ReaderAWS m a)
-> Functor (ReaderAWS m)
forall a b. a -> ReaderAWS m b -> ReaderAWS m a
forall a b. (a -> b) -> ReaderAWS m a -> ReaderAWS m b
forall (m :: * -> *) a b.
Functor m =>
a -> ReaderAWS m b -> ReaderAWS m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> ReaderAWS m a -> ReaderAWS m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> ReaderAWS m a -> ReaderAWS m b
fmap :: forall a b. (a -> b) -> ReaderAWS m a -> ReaderAWS m b
$c<$ :: forall (m :: * -> *) a b.
Functor m =>
a -> ReaderAWS m b -> ReaderAWS m a
<$ :: forall a b. a -> ReaderAWS m b -> ReaderAWS m a
Functor
, Functor (ReaderAWS m)
Functor (ReaderAWS m) =>
(forall a. a -> ReaderAWS m a)
-> (forall a b.
ReaderAWS m (a -> b) -> ReaderAWS m a -> ReaderAWS m b)
-> (forall a b c.
(a -> b -> c) -> ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m c)
-> (forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b)
-> (forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m a)
-> Applicative (ReaderAWS m)
forall a. a -> ReaderAWS m a
forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m a
forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
forall a b. ReaderAWS m (a -> b) -> ReaderAWS m a -> ReaderAWS m b
forall a b c.
(a -> b -> c) -> ReaderAWS m a -> ReaderAWS m b -> ReaderAWS 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 (ReaderAWS m)
forall (m :: * -> *) a. Applicative m => a -> ReaderAWS m a
forall (m :: * -> *) a b.
Applicative m =>
ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m a
forall (m :: * -> *) a b.
Applicative m =>
ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
forall (m :: * -> *) a b.
Applicative m =>
ReaderAWS m (a -> b) -> ReaderAWS m a -> ReaderAWS m b
forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m c
$cpure :: forall (m :: * -> *) a. Applicative m => a -> ReaderAWS m a
pure :: forall a. a -> ReaderAWS m a
$c<*> :: forall (m :: * -> *) a b.
Applicative m =>
ReaderAWS m (a -> b) -> ReaderAWS m a -> ReaderAWS m b
<*> :: forall a b. ReaderAWS m (a -> b) -> ReaderAWS m a -> ReaderAWS m b
$cliftA2 :: forall (m :: * -> *) a b c.
Applicative m =>
(a -> b -> c) -> ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m c
liftA2 :: forall a b c.
(a -> b -> c) -> ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m c
$c*> :: forall (m :: * -> *) a b.
Applicative m =>
ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
*> :: forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
$c<* :: forall (m :: * -> *) a b.
Applicative m =>
ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m a
<* :: forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m a
Applicative
, Applicative (ReaderAWS m)
Applicative (ReaderAWS m) =>
(forall a b.
ReaderAWS m a -> (a -> ReaderAWS m b) -> ReaderAWS m b)
-> (forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b)
-> (forall a. a -> ReaderAWS m a)
-> Monad (ReaderAWS m)
forall a. a -> ReaderAWS m a
forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
forall a b. ReaderAWS m a -> (a -> ReaderAWS m b) -> ReaderAWS m b
forall (m :: * -> *). Monad m => Applicative (ReaderAWS m)
forall (m :: * -> *) a. Monad m => a -> ReaderAWS m a
forall (m :: * -> *) a b.
Monad m =>
ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
forall (m :: * -> *) a b.
Monad m =>
ReaderAWS m a -> (a -> ReaderAWS m b) -> ReaderAWS 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
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
ReaderAWS m a -> (a -> ReaderAWS m b) -> ReaderAWS m b
>>= :: forall a b. ReaderAWS m a -> (a -> ReaderAWS m b) -> ReaderAWS m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
>> :: forall a b. ReaderAWS m a -> ReaderAWS m b -> ReaderAWS m b
$creturn :: forall (m :: * -> *) a. Monad m => a -> ReaderAWS m a
return :: forall a. a -> ReaderAWS m a
Monad
, Monad (ReaderAWS m)
Monad (ReaderAWS m) =>
(forall a. IO a -> ReaderAWS m a) -> MonadIO (ReaderAWS m)
forall a. IO a -> ReaderAWS m a
forall (m :: * -> *).
Monad m =>
(forall a. IO a -> m a) -> MonadIO m
forall (m :: * -> *). MonadIO m => Monad (ReaderAWS m)
forall (m :: * -> *) a. MonadIO m => IO a -> ReaderAWS m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> ReaderAWS m a
liftIO :: forall a. IO a -> ReaderAWS m a
MonadIO
, MonadIO (ReaderAWS m)
MonadIO (ReaderAWS m) =>
(forall a. ResourceT IO a -> ReaderAWS m a)
-> MonadResource (ReaderAWS m)
forall a. ResourceT IO a -> ReaderAWS m a
forall (m :: * -> *).
MonadIO m =>
(forall a. ResourceT IO a -> m a) -> MonadResource m
forall (m :: * -> *). MonadResource m => MonadIO (ReaderAWS m)
forall (m :: * -> *) a.
MonadResource m =>
ResourceT IO a -> ReaderAWS m a
$cliftResourceT :: forall (m :: * -> *) a.
MonadResource m =>
ResourceT IO a -> ReaderAWS m a
liftResourceT :: forall a. ResourceT IO a -> ReaderAWS m a
MonadResource
, MonadReader env
)
instance (MonadResource m, MonadReader env m, HasEnv env) => MonadAWS (ReaderAWS m) where
sendEither :: forall a.
(AWSRequest a, Typeable a, Typeable (AWSResponse a)) =>
a -> ReaderAWS m (Either Error (AWSResponse a))
sendEither a
req = do
Env
env <- Getting Env env Env -> ReaderAWS m Env
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Env env Env
forall env. HasEnv env => Lens' env Env
Lens' env Env
envL
Env -> a -> ReaderAWS m (Either Error (AWSResponse a))
forall (m :: * -> *) a.
(MonadResource m, AWSRequest a, Typeable a,
Typeable (AWSResponse a)) =>
Env -> a -> m (Either Error (AWSResponse a))
Amazonka.sendEither Env
env a
req
awaitEither :: forall a.
(AWSRequest a, Typeable a) =>
Wait a -> a -> ReaderAWS m (Either Error Accept)
awaitEither Wait a
w a
a = do
Env
env <- Getting Env env Env -> ReaderAWS m Env
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting Env env Env
forall env. HasEnv env => Lens' env Env
Lens' env Env
envL
Env -> Wait a -> a -> ReaderAWS m (Either Error Accept)
forall (m :: * -> *) a.
(MonadResource m, AWSRequest a, Typeable a) =>
Env -> Wait a -> a -> m (Either Error Accept)
Amazonka.awaitEither Env
env Wait a
w a
a
withAuth :: forall a. (AuthEnv -> ReaderAWS m a) -> ReaderAWS m a
withAuth AuthEnv -> ReaderAWS m a
f = do
Auth
auth <- Getting Auth env Auth -> ReaderAWS m Auth
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view (Getting Auth env Auth -> ReaderAWS m Auth)
-> Getting Auth env Auth -> ReaderAWS m Auth
forall a b. (a -> b) -> a -> b
$ (Env -> Const Auth Env) -> env -> Const Auth env
forall env. HasEnv env => Lens' env Env
Lens' env Env
envL ((Env -> Const Auth Env) -> env -> Const Auth env)
-> ((Auth -> Const Auth Auth) -> Env -> Const Auth Env)
-> Getting Auth env Auth
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identity Auth -> Const Auth (Identity Auth))
-> Env -> Const Auth Env
forall (withAuth :: * -> *) (withAuth' :: * -> *) (f :: * -> *).
Functor f =>
(withAuth Auth -> f (withAuth' Auth))
-> Env' withAuth -> f (Env' withAuth')
env_auth ((Identity Auth -> Const Auth (Identity Auth))
-> Env -> Const Auth Env)
-> ((Auth -> Const Auth Auth)
-> Identity Auth -> Const Auth (Identity Auth))
-> (Auth -> Const Auth Auth)
-> Env
-> Const Auth Env
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Identity Auth -> Auth)
-> (Auth -> Const Auth Auth)
-> Identity Auth
-> Const Auth (Identity Auth)
forall (p :: * -> * -> *) (f :: * -> *) s a.
(Profunctor p, Contravariant f) =>
(s -> a) -> Optic' p f s a
to Identity Auth -> Auth
forall a. Identity a -> a
runIdentity
Auth -> (AuthEnv -> ReaderAWS m a) -> ReaderAWS m a
forall (m :: * -> *) a.
MonadIO m =>
Auth -> (AuthEnv -> m a) -> m a
Amazonka.withAuth Auth
auth AuthEnv -> ReaderAWS m a
f
localEnv :: forall a. (Env -> Env) -> ReaderAWS m a -> ReaderAWS m a
localEnv Env -> Env
f = (env -> env) -> ReaderAWS m a -> ReaderAWS m a
forall a. (env -> env) -> ReaderAWS m a -> ReaderAWS m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local ((env -> env) -> ReaderAWS m a -> ReaderAWS m a)
-> (env -> env) -> ReaderAWS m a -> ReaderAWS m a
forall a b. (a -> b) -> a -> b
$ (Env -> Identity Env) -> env -> Identity env
forall env. HasEnv env => Lens' env Env
Lens' env Env
envL ((Env -> Identity Env) -> env -> Identity env)
-> (Env -> Env) -> env -> env
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Env -> Env
f