{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Cardano.Rpc.Server.Internal.Monad
( Has (..)
, MonadRpc
, grab
, putTrace
)
where
import Cardano.Api
import Cardano.Rpc.Server.Internal.Env
import RIO
import Control.Tracer (Tracer, traceWith)
class Has field env where
obtain :: env -> field
instance Has a a where
obtain :: a -> a
obtain = a -> a
forall a. a -> a
id
instance Has LocalNodeConnectInfo RpcEnv where
obtain :: RpcEnv -> LocalNodeConnectInfo
obtain RpcEnv{LocalNodeConnectInfo
rpcLocalNodeConnectInfo :: LocalNodeConnectInfo
rpcLocalNodeConnectInfo :: RpcEnv -> LocalNodeConnectInfo
rpcLocalNodeConnectInfo} = LocalNodeConnectInfo
rpcLocalNodeConnectInfo
instance MonadIO m => Has (Tracer m String) RpcEnv where
obtain :: RpcEnv -> Tracer m String
obtain RpcEnv{forall (m :: * -> *). MonadIO m => Tracer m String
tracer :: forall (m :: * -> *). MonadIO m => Tracer m String
tracer :: RpcEnv -> forall (m :: * -> *). MonadIO m => Tracer m String
tracer} = Tracer m String
forall (m :: * -> *). MonadIO m => Tracer m String
tracer
grab
:: forall field env m
. (Has field env, MonadReader env m)
=> m field
grab :: forall field env (m :: * -> *).
(Has field env, MonadReader env m) =>
m field
grab = (env -> field) -> m field
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks ((env -> field) -> m field) -> (env -> field) -> m field
forall a b. (a -> b) -> a -> b
$ forall field env. Has field env => env -> field
obtain @field
{-# INLINE grab #-}
putTrace :: (Has (Tracer m t) e, MonadReader e m) => t -> m ()
putTrace :: forall (m :: * -> *) t e.
(Has (Tracer m t) e, MonadReader e m) =>
t -> m ()
putTrace t
t = m (Tracer m t)
forall field env (m :: * -> *).
(Has field env, MonadReader env m) =>
m field
grab m (Tracer m t) -> (Tracer m t -> m ()) -> m ()
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Tracer m t -> t -> m ()
forall (m :: * -> *) a. Tracer m a -> a -> m ()
`traceWith` t
t)
type MonadRpc e m =
( Has (Tracer m String) e
, Has LocalNodeConnectInfo e
, HasCallStack
, MonadReader e m
, MonadUnliftIO m
)