module Chiasma.Effect.TmuxClient where

import Prelude hiding (send)

import Chiasma.Data.TmuxRequest (TmuxRequest)
import Chiasma.Data.TmuxResponse (TmuxResponse)

data TmuxClient (i :: Type) (o :: Type) :: Effect where
  Send :: i -> TmuxClient i o m o
  Schedule :: i -> TmuxClient i o m ()

makeSem ''TmuxClient

type ScopedTmux i o =
  Scoped_ (TmuxClient i o)

type NativeTmux =
  ScopedTmux TmuxRequest TmuxResponse

flush ::
  Member (TmuxClient e d) r =>
  InterpreterFor (TmuxClient e d) r
flush :: forall e d (r :: EffectRow).
Member (TmuxClient e d) r =>
InterpreterFor (TmuxClient e d) r
flush =
  (forall (rInitial :: EffectRow) x.
 TmuxClient e d (Sem rInitial) x -> Sem r x)
-> Sem (TmuxClient e d : r) a -> Sem r a
forall (e :: Effect) (r :: EffectRow) a.
FirstOrder e "interpret" =>
(forall (rInitial :: EffectRow) x. e (Sem rInitial) x -> Sem r x)
-> Sem (e : r) a -> Sem r a
interpret \case
    Send e
cmd ->
      e -> Sem r x
forall i o (r :: EffectRow).
Member (TmuxClient i o) r =>
i -> Sem r o
send e
cmd
    Schedule e
cmd ->
      Sem r d -> Sem r ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (e -> Sem r d
forall i o (r :: EffectRow).
Member (TmuxClient i o) r =>
i -> Sem r o
send e
cmd)