module Tendermint.SDK.BaseApp.Effects.BaseEffs
  ( BaseEffs
  , evalBaseEffs
  , evalBaseEffsPure
  ) where
import           Control.Exception                         (throwIO)
import           Control.Monad.IO.Class                    (liftIO)
import           Polysemy                                  (Embed, Members, Sem)
import           Polysemy.Error                            (Error, runError)
import           Polysemy.Reader                           (Reader)
import           Polysemy.Resource                         (Resource,
                                                            resourceToIO)
import           Tendermint.SDK.BaseApp.Errors             (AppError)
import           Tendermint.SDK.BaseApp.Logger             (Logger)
import qualified Tendermint.SDK.BaseApp.Logger.Katip       as KL
import           Tendermint.SDK.BaseApp.Metrics            (Metrics)
import qualified Tendermint.SDK.BaseApp.Metrics.Prometheus as Prometheus
import           Tendermint.SDK.Types.Effects              ((:&))
type BaseEffs =
  [ Metrics
  , Logger
  , Resource
  , Error AppError
  ]
evalBaseEffs
  :: Members [Embed IO, Reader KL.LogConfig, Reader (Maybe Prometheus.PrometheusEnv)] core
  => forall a.
     Sem (BaseEffs :& core) a
  -> Sem core a
evalBaseEffs :: forall a. Sem (BaseEffs :& core) a -> Sem core a
evalBaseEffs action :: Sem (BaseEffs :& core) a
action = do
  Either AppError a
eRes <- Sem (Error AppError : core) a -> Sem core (Either AppError a)
forall e (r :: [(* -> *) -> * -> *]) a.
Sem (Error e : r) a -> Sem r (Either e a)
runError (Sem (Error AppError : core) a -> Sem core (Either AppError a))
-> (Sem (Metrics : Logger : Resource : Error AppError : core) a
    -> Sem (Error AppError : core) a)
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem core (Either AppError a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Sem (Resource : Error AppError : core) a
-> Sem (Error AppError : core) a
forall (r :: [(* -> *) -> * -> *]) a.
Member (Embed IO) r =>
Sem (Resource : r) a -> Sem r a
resourceToIO (Sem (Resource : Error AppError : core) a
 -> Sem (Error AppError : core) a)
-> (Sem (Metrics : Logger : Resource : Error AppError : core) a
    -> Sem (Resource : Error AppError : core) a)
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem (Error AppError : core) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Sem (Logger : Resource : Error AppError : core) a
-> Sem (Resource : Error AppError : core) a
forall (r :: [(* -> *) -> * -> *]) a.
KatipContext (Sem r) =>
Sem (Logger : r) a -> Sem r a
KL.evalKatip (Sem (Logger : Resource : Error AppError : core) a
 -> Sem (Resource : Error AppError : core) a)
-> (Sem (Metrics : Logger : Resource : Error AppError : core) a
    -> Sem (Logger : Resource : Error AppError : core) a)
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem (Resource : Error AppError : core) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem (Logger : Resource : Error AppError : core) a
forall (r :: [(* -> *) -> * -> *]) a.
(Member (Embed IO) r, Member (Reader (Maybe PrometheusEnv)) r) =>
Sem (Metrics : r) a -> Sem r a
Prometheus.evalWithMetrics (Sem (Metrics : Logger : Resource : Error AppError : core) a
 -> Sem core (Either AppError a))
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem core (Either AppError a)
forall a b. (a -> b) -> a -> b
$
    Sem (Metrics : Logger : Resource : Error AppError : core) a
Sem (BaseEffs :& core) a
action
  (AppError -> Sem core a)
-> (a -> Sem core a) -> Either AppError a -> Sem core a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (IO a -> Sem core a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> Sem core a)
-> (AppError -> IO a) -> AppError -> Sem core a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AppError -> IO a
forall e a. Exception e => e -> IO a
throwIO) a -> Sem core a
forall (m :: * -> *) a. Monad m => a -> m a
return Either AppError a
eRes
evalBaseEffsPure
  :: Members [Embed IO, Reader KL.LogConfig] core
  => forall a.
     Sem (BaseEffs :& core) a
  -> Sem core a
evalBaseEffsPure :: forall a. Sem (BaseEffs :& core) a -> Sem core a
evalBaseEffsPure action :: Sem (BaseEffs :& core) a
action = do
  Either AppError a
eRes <- Sem (Error AppError : core) a -> Sem core (Either AppError a)
forall e (r :: [(* -> *) -> * -> *]) a.
Sem (Error e : r) a -> Sem r (Either e a)
runError (Sem (Error AppError : core) a -> Sem core (Either AppError a))
-> (Sem (Metrics : Logger : Resource : Error AppError : core) a
    -> Sem (Error AppError : core) a)
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem core (Either AppError a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Sem (Resource : Error AppError : core) a
-> Sem (Error AppError : core) a
forall (r :: [(* -> *) -> * -> *]) a.
Member (Embed IO) r =>
Sem (Resource : r) a -> Sem r a
resourceToIO (Sem (Resource : Error AppError : core) a
 -> Sem (Error AppError : core) a)
-> (Sem (Metrics : Logger : Resource : Error AppError : core) a
    -> Sem (Resource : Error AppError : core) a)
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem (Error AppError : core) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Sem (Logger : Resource : Error AppError : core) a
-> Sem (Resource : Error AppError : core) a
forall (r :: [(* -> *) -> * -> *]) a.
KatipContext (Sem r) =>
Sem (Logger : r) a -> Sem r a
KL.evalKatip (Sem (Logger : Resource : Error AppError : core) a
 -> Sem (Resource : Error AppError : core) a)
-> (Sem (Metrics : Logger : Resource : Error AppError : core) a
    -> Sem (Logger : Resource : Error AppError : core) a)
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem (Resource : Error AppError : core) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
    Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem (Logger : Resource : Error AppError : core) a
forall (r :: [(* -> *) -> * -> *]) a.
Sem (Metrics : r) a -> Sem r a
Prometheus.evalNothing (Sem (Metrics : Logger : Resource : Error AppError : core) a
 -> Sem core (Either AppError a))
-> Sem (Metrics : Logger : Resource : Error AppError : core) a
-> Sem core (Either AppError a)
forall a b. (a -> b) -> a -> b
$
    Sem (Metrics : Logger : Resource : Error AppError : core) a
Sem (BaseEffs :& core) a
action
  (AppError -> Sem core a)
-> (a -> Sem core a) -> Either AppError a -> Sem core a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (IO a -> Sem core a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> Sem core a)
-> (AppError -> IO a) -> AppError -> Sem core a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AppError -> IO a
forall e a. Exception e => e -> IO a
throwIO) a -> Sem core a
forall (m :: * -> *) a. Monad m => a -> m a
return Either AppError a
eRes