helic-0.6.0.0: lib/Helic/Interpreter/AgentTmux.hs
-- |Agent Interpreter for Tmux, Internal
module Helic.Interpreter.AgentTmux where
import Exon (exon)
import qualified Log
import Path (Abs, File, Path, toFilePath)
import Polysemy.Process (Process, ProcessKill (KillAfter), interpretProcessByteString, interpretProcessNative_)
import Polysemy.Process.Data.ProcessError (ProcessError)
import Polysemy.Process.Data.ProcessOptions (ProcessOptions (kill))
import qualified System.Process.Typed as Process
import System.Process.Typed (ProcessConfig)
import Time (MilliSeconds (MilliSeconds), convert)
import qualified Helic.Data.TmuxConfig as TmuxConfig
import Helic.Data.TmuxConfig (TmuxConfig)
import Helic.Effect.Agent (Agent (Update), AgentTmux)
import Helic.Interpreter.Agent (interpretAgentIf)
import Helic.Tmux (sendToTmux)
-- |Process definition for running `tmux load-buffer -`.
tmuxProc ::
Maybe (Path Abs File) ->
ProcessConfig () () ()
tmuxProc exe =
Process.proc cmd ["load-buffer", "-"]
where
cmd =
maybe "tmux" toFilePath exe
-- |Handle 'Agent' using a tmux server as the target.
handleAgentTmux ::
Members [Scoped_ (Process ByteString o) !! ProcessError, Log] r =>
Agent m a ->
Sem r a
handleAgentTmux (Update event) =
sendToTmux @_ @(_ _ : _) event !! \ (e :: ProcessError) ->
Log.error [exon|Sending to tmux: #{show e}|]
-- |Interpret 'Agent' using a tmux server as the target.
interpretAgentTmux ::
Members [Reader TmuxConfig, Log, Resource, Race, Async, Embed IO] r =>
InterpreterFor Agent r
interpretAgentTmux sem = do
conf <- ask
interpretProcessByteString $
interpretProcessNative_ options (tmuxProc conf.exe) $
interpret handleAgentTmux $
insertAt @1 sem
where
options = def { kill = KillAfter (convert (MilliSeconds 500)) }
-- | Interpret 'Agent' for tmux if it is enabled by the configuration.
interpretAgentTmuxIfEnabled ::
Members [Reader TmuxConfig, Log, Resource, Race, Async, Embed IO] r =>
InterpreterFor (Agent @@ AgentTmux) r
interpretAgentTmuxIfEnabled =
interpretAgentIf interpretAgentTmux