helic-0.4.0.0: lib/Helic/Interpreter/AgentX.hs
-- |Agent Interpreter for X11, Internal
module Helic.Interpreter.AgentX where
import qualified Conc
import Conc (withAsync_)
import Exon (exon)
import Polysemy.Chronos (ChronosTime)
import qualified Polysemy.Log as Log
import qualified Helic.Data.Event as Event
import Helic.Data.Event (Event (Event))
import Helic.Data.InstanceName (InstanceName)
import Helic.Data.XClipboardEvent (XClipboardEvent (XClipboardEvent))
import Helic.Effect.Agent (Agent (Update), AgentX, agentIdX)
import qualified Helic.Effect.XClipboard as XClipboard
import Helic.Effect.XClipboard (XClipboard)
import Helic.Interpreter (interpreting)
-- |Listen for 'XClipboardEvent's and publish them as 'Event's.
transformXEvents ::
Members [EventConsumer xr XClipboardEvent, Reader InstanceName] r =>
Members [Events er Event, XClipboard !! Text, Log, ChronosTime, Resource, Race, Async] r =>
Sem r a ->
Sem r a
transformXEvents =
withAsync_ do
Conc.subscribeLoop \case
XClipboardEvent text selection -> do
XClipboard.sync text selection !! \ e ->
Log.error [exon|Syncing the X clipboard failed: #{e}|]
ev <- Event.now agentIdX text
Conc.publish ev
-- |Interpret 'Agent' using the X11 clipboard as target.
-- This interpreter also runs a thread that converts events generated by the 'XClipboard' interpreter
-- ('XClipboardEvent') to the main 'Event' type.
interpretAgentX ::
Members [EventConsumer xr XClipboardEvent, Events er Event, Reader InstanceName, XClipboard !! Text, ChronosTime] r =>
Members [Events xr XClipboardEvent, Log, Error Text, Race, Resource, Async, Embed IO, Final IO] r =>
InterpreterFor (Tagged AgentX Agent) r
interpretAgentX sem =
transformXEvents $
interpreting (untag sem) \case
Update Event {..} ->
XClipboard.set content !! \ e ->
Log.error [exon|Setting the X clipboard failed: #{e}|]