module Helic.Interpreter.AgentNet where
import Polysemy.Http (Manager)
import qualified Polysemy.Log as Log
import Helic.Data.Event (Event (source))
import qualified Helic.Data.NetConfig
import Helic.Data.NetConfig (NetConfig (NetConfig))
import Helic.Effect.Agent (Agent (Update), AgentNet, agentIdNet)
import Helic.Interpreter.Agent (interpretAgentIf)
import Helic.Net.Client (sendTo)
interpretAgentNet ::
Members [Manager, Reader NetConfig] r =>
Members [Log, Interrupt, Race, Resource, Async, Embed IO, Final IO] r =>
InterpreterFor Agent r
interpretAgentNet :: forall (r :: EffectRow).
(Members '[Manager, Reader NetConfig] r,
Members
'[Log, Interrupt, Race, Resource, Async, Embed IO, Final IO] r) =>
InterpreterFor Agent r
interpretAgentNet =
forall (e :: (* -> *) -> * -> *) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \ (Update Event
e) -> do
NetConfig Maybe Bool
_ Maybe Int
_ Maybe Timeout
timeout Maybe [Host]
hosts <- forall i (r :: EffectRow). Member (Reader i) r => Sem r i
ask
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold Maybe [Host]
hosts) \ Host
host ->
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (r :: EffectRow).
(HasCallStack, Member Log r) =>
Text -> Sem r ()
Log.debug forall (f :: * -> *) a. Applicative f => a -> f a
pure forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall e (r :: EffectRow) a.
Sem (Error e : r) a -> Sem r (Either e a)
runError (forall (r :: EffectRow).
Members '[Manager, Log, Race, Error Text, Embed IO] r =>
Maybe Timeout -> Host -> Event -> Sem r ()
sendTo Maybe Timeout
timeout Host
host Event
e { $sel:source:Event :: AgentId
source = AgentId
agentIdNet })
interpretAgentNetIfEnabled ::
Members [Manager, Reader NetConfig] r =>
Members [Log, Interrupt, Race, Resource, Async, Embed IO, Final IO] r =>
InterpreterFor (Agent @@ AgentNet) r
interpretAgentNetIfEnabled :: forall (r :: EffectRow).
(Members '[Manager, Reader NetConfig] r,
Members
'[Log, Interrupt, Race, Resource, Async, Embed IO, Final IO] r) =>
InterpreterFor (Agent @@ AgentNet) r
interpretAgentNetIfEnabled Sem ((Agent @@ AgentNet) : r) a
sem = do
forall {k} conf (r :: EffectRow) (id :: k).
(HasField "enable" conf (Maybe Bool), Member (Reader conf) r) =>
InterpreterFor Agent r -> InterpreterFor (Agent @@ id) r
interpretAgentIf forall (r :: EffectRow).
(Members '[Manager, Reader NetConfig] r,
Members
'[Log, Interrupt, Race, Resource, Async, Embed IO, Final IO] r) =>
InterpreterFor Agent r
interpretAgentNet Sem ((Agent @@ AgentNet) : r) a
sem