packages feed

chiasma-0.10.0.0: lib/Chiasma/Event.hs

module Chiasma.Event where

import Exon (exon)
import qualified Polysemy.Conc as Conc
import Polysemy.Conc (withAsync_)
import qualified Polysemy.Log as Log
import qualified Polysemy.Time as Time
import Polysemy.Time (Seconds (Seconds))
import Prelude hiding (listen)

import Chiasma.Data.Event (Event)
import Chiasma.Data.ReceiveEvent (ReceiveEvent (ReceiveEvent))
import Chiasma.Data.TmuxError (TmuxError)
import Chiasma.Effect.Codec (Codec)
import qualified Chiasma.Effect.TmuxApi as TmuxApi
import Chiasma.Effect.TmuxApi (TmuxApi)
import Chiasma.Effect.TmuxClient (TmuxClient)
import Chiasma.Tmux (withTmux)

receiveEvent ::
  ∀ r .
  Members [TmuxApi ReceiveEvent, Events Event] r =>
  Sem r ()
receiveEvent =
  Conc.publish =<< TmuxApi.send ReceiveEvent

listenLoop ::
  ∀ err t d r .
  Show err =>
  Members [TmuxApi ReceiveEvent !! err, Events Event, Time t d, Log] r =>
  Sem r ()
listenLoop = do
  resume @_ @(TmuxApi _) receiveEvent \ err ->
    Log.error [exon|Receiving tmux event: #{show err}|]
  listenLoop

listen ::
  ∀ enc dec err t d r .
  Show err =>
  Member (Codec ReceiveEvent enc dec !! err) r =>
  Members [Scoped_ (TmuxClient enc dec) !! TmuxError, Events Event, Time t d, Log] r =>
  Sem r ()
listen = do
  resume @_ @(Scoped_ _) (withTmux listenLoop) \ err -> do
    Log.error [exon|Lost connection to tmux: #{show err}
Reconnecting...|]
    Time.sleep (Seconds 1)

withTmuxEvents ::
  Show err =>
  Member (Codec ReceiveEvent enc dec !! err) r =>
  Member (Scoped_ (TmuxClient enc dec) !! TmuxError) r =>
  Members [Events Event, Time t d, Log, Race, Async, Resource] r =>
  Sem r a ->
  Sem r a
withTmuxEvents =
  withAsync_ do
    forever listen