packages feed

effectful-zoo-0.0.1.0: components/amazonka/Effectful/Zoo/Amazonka/Dynamic.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Effectful.Zoo.Amazonka.Dynamic
  ( Amazonka(..),

    runAmazonka,
    runAmazonkaM,
  ) where

import Amazonka qualified as AWS
import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Resource
import Effectful.Zoo.Amazonka.Data.AwsEnv
import Effectful.Zoo.Amazonka.Data.AwsError
import Effectful.Zoo.Amazonka.Data.AwsRequest
import Effectful.Zoo.Amazonka.Data.AwsResponse
import Effectful.Zoo.Amazonka.Static qualified as S
import Effectful.Zoo.Core
import HaskellWorks.Prelude

data Amazonka :: Effect where
  AskAwsEnv
      :: Amazonka m AwsEnv

  LocalAwsEnv
    :: (AwsEnv -> AwsEnv)
    -> m a
    -> Amazonka m a
    
  SendAws
    :: ( HasCallStack
       , AwsRequest a
       , Typeable a
       , Typeable (AwsResponse a)
       )
    => a
    -> Amazonka m (Either AwsError (AwsResponse a))
  
type instance DispatchOf Amazonka = Dynamic

runAmazonka :: forall a r. ()
  => r <: IOE
  => r <: Resource
  => AwsEnv
  -> Eff (Amazonka : r) a
  -> Eff r a
runAmazonka awsEnv =
  reinterpret (S.runAmazonka awsEnv) $ \env -> \case
    AskAwsEnv -> S.askAwsEnv
    LocalAwsEnv f m -> do
      localSeqUnlift env \unlift -> S.localAmazonka f (unlift m)
    SendAws req -> do
      awsEnv' <- S.askAwsEnv
      AWS.sendEither awsEnv' req

runAmazonkaM :: forall a r. ()
  => r <: IOE
  => r <: Resource
  => Eff r AwsEnv
  -> Eff (Amazonka : r) a
  -> Eff r a
runAmazonkaM mk f = do
  awsEnv <- mk
  runAmazonka awsEnv f