-- |Simple Agent Interpreter, Internal
module Helic.Interpreter.Agent where

import Helic.Data.Event (Event)
import Helic.Effect.Agent (Agent (Update))
import Helic.Interpreter (interpreting)

-- |Interpret 'Agent' with an action.
interpretAgent ::
   id r .
  (Event -> Sem r ()) ->
  InterpreterFor (Tagged id Agent) r
interpretAgent :: (Event -> Sem r ()) -> InterpreterFor (Tagged id Agent) r
interpretAgent Event -> Sem r ()
handle Sem (Tagged id Agent : r) a
sem =
  Sem (Agent : r) a
-> (forall (r0 :: EffectRow) x. Agent (Sem r0) x -> Sem r x)
-> Sem r a
forall (e :: Effect) (r :: EffectRow) a.
FirstOrder e "interpret" =>
Sem (e : r) a
-> (forall (r0 :: EffectRow) x. e (Sem r0) x -> Sem r x) -> Sem r a
interpreting (Sem (Tagged id Agent : r) a -> Sem (Agent : r) a
forall k1 (k2 :: k1) (e :: Effect) (r :: EffectRow) a.
Sem (Tagged k2 e : r) a -> Sem (e : r) a
untag Sem (Tagged id Agent : r) a
sem) \case
    Update Event
e ->
      Event -> Sem r ()
handle Event
e