{-# options_haddock prune #-}

-- |Yank Logic, Internal
module Helic.Yank where

import qualified Data.Text.IO as Text
import Polysemy.Chronos (ChronosTime)
import System.IO (stdin)

import Helic.Data.AgentId (AgentId (AgentId))
import qualified Helic.Data.Event as Event
import Helic.Data.InstanceName (InstanceName)
import Helic.Data.YankConfig (YankConfig (YankConfig))
import qualified Helic.Effect.Client as Client
import Helic.Effect.Client (Client)

-- |Send an event to the server.
yank ::
  Members [Reader InstanceName, Client, ChronosTime, Error Text, Embed IO] r =>
  YankConfig ->
  Sem r ()
yank :: forall (r :: EffectRow).
Members
  '[Reader InstanceName, Client, ChronosTime, Error Text, Embed IO]
  r =>
YankConfig -> Sem r ()
yank (YankConfig Maybe Text
agent) = do
  Text
text <- forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (Handle -> IO Text
Text.hGetContents Handle
stdin)
  Event
event <- forall (r :: EffectRow).
Members '[ChronosTime, Reader InstanceName] r =>
AgentId -> Text -> Sem r Event
Event.now (Text -> AgentId
AgentId (forall a. a -> Maybe a -> a
fromMaybe Text
"cli" Maybe Text
agent)) Text
text
  forall e (r :: EffectRow) a.
Member (Error e) r =>
Either e a -> Sem r a
fromEither forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (r :: EffectRow).
Member Client r =>
Event -> Sem r (Either Text ())
Client.yank Event
event