-- |Agent Interpreter for X11, Internal module Helic.Interpreter.AgentX where import Polysemy.Chronos (ChronosTime) import qualified Polysemy.Conc as Conc import Polysemy.Conc (EventConsumer, Events, withAsync_) import Polysemy.Tagged (Tagged, untag) 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) -- |Listen for 'XClipboardEvent's and publish them as 'Event's. transformXEvents :: Member (Reader InstanceName) r => Members [EventConsumer xr XClipboardEvent, Events er Event, XClipboard, 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 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, ChronosTime] r => Members [Events xr XClipboardEvent, 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