packages feed

helic-0.2.0.0: lib/Helic/Interpreter/Client.hs

module Helic.Interpreter.Client where

import Polysemy.Http (Manager)
import qualified Polysemy.Http.Effect.Manager as Manager
import Polysemy.Log (Log)
import Servant.Client (mkClientEnv, runClientM)

import Helic.Data.Event (Event)
import qualified Helic.Data.NetConfig as NetConfig
import Helic.Data.NetConfig (NetConfig)
import Helic.Effect.Client (Client (Get, Yank))
import qualified Helic.Net.Client as Api
import Helic.Net.Client (localhost, localhostUrl, sendTo)

interpretClientNet ::
  Members [Manager, Reader NetConfig, Log, Error Text, Race, Embed IO] r =>
  InterpreterFor Client r
interpretClientNet =
  interpret \case
    Get -> do
      env <- mkClientEnv <$> Manager.get <*> localhostUrl
      bimap show toList <$> embed (runClientM Api.get env)
    Yank event -> do
      host <- localhost
      timeout <- asks NetConfig.timeout
      runError (sendTo timeout host event)

interpretClientConst ::
  [Event] ->
  InterpreterFor Client r
interpretClientConst evs =
  interpret \case
    Get -> pure (Right evs)
    Yank _ -> pure (Left "const client cannot yank")