{-# options_haddock prune #-}

-- |CLI, Internal
module Helic.Cli where

import Options.Applicative (customExecParser, fullDesc, header, helper, info, prefs, showHelpOnEmpty, showHelpOnError)
import Polysemy.Chronos (ChronosTime, interpretTimeChronos)
import qualified Polysemy.Conc as Conc
import Polysemy.Conc (
  Critical,
  Interrupt,
  interpretAtomic,
  interpretCritical,
  interpretEventsChan,
  interpretInterrupt,
  interpretRace,
  interpretSync,
  withAsync_,
  )
import Polysemy.Error (errorToIOFinal)
import Polysemy.Http (Manager)
import Polysemy.Http.Interpreter.Manager (interpretManager)
import qualified Polysemy.Log as Log
import Polysemy.Log (Log, Severity (Info, Trace), interpretLogStdoutLevelConc)
import Polysemy.Time (MilliSeconds (MilliSeconds))
import System.IO (hLookAhead)

import Helic.Cli.Options (Command (List, Listen, Load, Yank), Conf (Conf), parser)
import Helic.Config.File (findFileConfig)
import Helic.Data.Config (Config (Config))
import Helic.Data.Event (Event)
import Helic.Data.ListConfig (ListConfig)
import Helic.Data.LoadConfig (LoadConfig (LoadConfig))
import Helic.Data.NetConfig (NetConfig)
import Helic.Data.XClipboardEvent (XClipboardEvent)
import Helic.Data.YankConfig (YankConfig (YankConfig))
import qualified Helic.Effect.Client as Client
import Helic.Effect.Client (Client)
import qualified Helic.Effect.History as History
import Helic.Interpreter.AgentNet (interpretAgentNet)
import Helic.Interpreter.AgentTmux (interpretAgentTmux)
import Helic.Interpreter.AgentX (interpretAgentX)
import Helic.Interpreter.Client (interpretClientNet)
import Helic.Interpreter.History (interpretHistory)
import Helic.Interpreter.InstanceName (interpretInstanceName)
import Helic.Interpreter.XClipboard (interpretXClipboardGtk, listenXClipboard)
import Helic.List (list)
import Helic.Net.Api (serve)
import Helic.Yank (yank)

logError ::
  Members [Log, Final IO] r =>
  Sem (Error Text : r) () ->
  Sem r ()
logError :: Sem (Error Text : r) () -> Sem r ()
logError Sem (Error Text : r) ()
sem =
  Sem (Error Text : r) () -> Sem r (Either Text ())
forall e (r :: EffectRow) a.
(Typeable e, Member (Final IO) r) =>
Sem (Error e : r) a -> Sem r (Either e a)
errorToIOFinal Sem (Error Text : r) ()
sem Sem r (Either Text ()) -> (Either Text () -> Sem r ()) -> Sem r ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
    Right () -> Sem r ()
forall (f :: * -> *). Applicative f => f ()
unit
    Left Text
err -> Text -> Sem r ()
forall (r :: EffectRow).
(HasCallStack, Member Log r) =>
Text -> Sem r ()
Log.error Text
err

type IOStack =
  [
    Error Text,
    Interrupt,
    Critical,
    Log,
    ChronosTime,
    Race,
    Async,
    Resource,
    Embed IO,
    Final IO
  ]

runIO ::
  Bool ->
  Sem IOStack () ->
  IO ()
runIO :: Bool -> Sem IOStack () -> IO ()
runIO Bool
verbose =
  Sem '[Final IO] () -> IO ()
forall (m :: * -> *) a. Monad m => Sem '[Final m] a -> m a
runFinal (Sem '[Final IO] () -> IO ())
-> (Sem IOStack () -> Sem '[Final IO] ())
-> Sem IOStack ()
-> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem '[Embed IO, Final IO] () -> Sem '[Final IO] ()
forall (m :: * -> *) (r :: EffectRow) a.
(Member (Final m) r, Functor m) =>
Sem (Embed m : r) a -> Sem r a
embedToFinal (Sem '[Embed IO, Final IO] () -> Sem '[Final IO] ())
-> (Sem IOStack () -> Sem '[Embed IO, Final IO] ())
-> Sem IOStack ()
-> Sem '[Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem '[Resource, Embed IO, Final IO] ()
-> Sem '[Embed IO, Final IO] ()
forall (r :: EffectRow) a.
Member (Final IO) r =>
Sem (Resource : r) a -> Sem r a
resourceToIOFinal (Sem '[Resource, Embed IO, Final IO] ()
 -> Sem '[Embed IO, Final IO] ())
-> (Sem IOStack () -> Sem '[Resource, Embed IO, Final IO] ())
-> Sem IOStack ()
-> Sem '[Embed IO, Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem '[Async, Resource, Embed IO, Final IO] ()
-> Sem '[Resource, Embed IO, Final IO] ()
forall (r :: EffectRow) a.
Member (Final IO) r =>
Sem (Async : r) a -> Sem r a
asyncToIOFinal (Sem '[Async, Resource, Embed IO, Final IO] ()
 -> Sem '[Resource, Embed IO, Final IO] ())
-> (Sem IOStack ()
    -> Sem '[Async, Resource, Embed IO, Final IO] ())
-> Sem IOStack ()
-> Sem '[Resource, Embed IO, Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem '[Race, Async, Resource, Embed IO, Final IO] ()
-> Sem '[Async, Resource, Embed IO, Final IO] ()
forall (r :: EffectRow).
Member (Final IO) r =>
InterpreterFor Race r
interpretRace (Sem '[Race, Async, Resource, Embed IO, Final IO] ()
 -> Sem '[Async, Resource, Embed IO, Final IO] ())
-> (Sem IOStack ()
    -> Sem '[Race, Async, Resource, Embed IO, Final IO] ())
-> Sem IOStack ()
-> Sem '[Async, Resource, Embed IO, Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem '[ChronosTime, Race, Async, Resource, Embed IO, Final IO] ()
-> Sem '[Race, Async, Resource, Embed IO, Final IO] ()
forall (r :: EffectRow).
Member (Embed IO) r =>
InterpreterFor ChronosTime r
interpretTimeChronos (Sem '[ChronosTime, Race, Async, Resource, Embed IO, Final IO] ()
 -> Sem '[Race, Async, Resource, Embed IO, Final IO] ())
-> (Sem IOStack ()
    -> Sem
         '[ChronosTime, Race, Async, Resource, Embed IO, Final IO] ())
-> Sem IOStack ()
-> Sem '[Race, Async, Resource, Embed IO, Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Maybe Severity
-> InterpreterFor
     Log '[ChronosTime, Race, Async, Resource, Embed IO, Final IO]
forall (r :: EffectRow).
Members '[Resource, Async, Race, Embed IO] r =>
Maybe Severity -> InterpreterFor Log r
interpretLogStdoutLevelConc (if Bool
verbose then (Severity -> Maybe Severity
forall a. a -> Maybe a
Just Severity
Trace) else Severity -> Maybe Severity
forall a. a -> Maybe a
Just Severity
Info) (Sem
   '[Log, ChronosTime, Race, Async, Resource, Embed IO, Final IO] ()
 -> Sem
      '[ChronosTime, Race, Async, Resource, Embed IO, Final IO] ())
-> (Sem IOStack ()
    -> Sem
         '[Log, ChronosTime, Race, Async, Resource, Embed IO, Final IO] ())
-> Sem IOStack ()
-> Sem '[ChronosTime, Race, Async, Resource, Embed IO, Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem
  '[Critical, Log, ChronosTime, Race, Async, Resource, Embed IO,
    Final IO]
  ()
-> Sem
     '[Log, ChronosTime, Race, Async, Resource, Embed IO, Final IO] ()
forall (r :: EffectRow).
Member (Final IO) r =>
InterpreterFor Critical r
interpretCritical (Sem
   '[Critical, Log, ChronosTime, Race, Async, Resource, Embed IO,
     Final IO]
   ()
 -> Sem
      '[Log, ChronosTime, Race, Async, Resource, Embed IO, Final IO] ())
-> (Sem IOStack ()
    -> Sem
         '[Critical, Log, ChronosTime, Race, Async, Resource, Embed IO,
           Final IO]
         ())
-> Sem IOStack ()
-> Sem
     '[Log, ChronosTime, Race, Async, Resource, Embed IO, Final IO] ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem
  '[Interrupt, Critical, Log, ChronosTime, Race, Async, Resource,
    Embed IO, Final IO]
  ()
-> Sem
     '[Critical, Log, ChronosTime, Race, Async, Resource, Embed IO,
       Final IO]
     ()
forall (r :: EffectRow).
Members '[Critical, Race, Async, Embed IO] r =>
InterpreterFor Interrupt r
interpretInterrupt (Sem
   '[Interrupt, Critical, Log, ChronosTime, Race, Async, Resource,
     Embed IO, Final IO]
   ()
 -> Sem
      '[Critical, Log, ChronosTime, Race, Async, Resource, Embed IO,
        Final IO]
      ())
-> (Sem IOStack ()
    -> Sem
         '[Interrupt, Critical, Log, ChronosTime, Race, Async, Resource,
           Embed IO, Final IO]
         ())
-> Sem IOStack ()
-> Sem
     '[Critical, Log, ChronosTime, Race, Async, Resource, Embed IO,
       Final IO]
     ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem IOStack ()
-> Sem
     '[Interrupt, Critical, Log, ChronosTime, Race, Async, Resource,
       Embed IO, Final IO]
     ()
forall (r :: EffectRow).
Members '[Log, Final IO] r =>
Sem (Error Text : r) () -> Sem r ()
logError

listenApp ::
  Config ->
  Sem IOStack ()
listenApp :: Config -> Sem IOStack ()
listenApp (Config Maybe Text
name Maybe TmuxConfig
tmux Maybe NetConfig
net Maybe Int
maxHistory) =
  TmuxConfig
-> Sem (Reader TmuxConfig : IOStack) () -> Sem IOStack ()
forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a
runReader (TmuxConfig -> Maybe TmuxConfig -> TmuxConfig
forall a. a -> Maybe a -> a
fromMaybe TmuxConfig
forall a. Default a => a
def Maybe TmuxConfig
tmux) (Sem (Reader TmuxConfig : IOStack) () -> Sem IOStack ())
-> Sem (Reader TmuxConfig : IOStack) () -> Sem IOStack ()
forall a b. (a -> b) -> a -> b
$
  NetConfig
-> Sem (Reader NetConfig : Reader TmuxConfig : IOStack) ()
-> Sem (Reader TmuxConfig : IOStack) ()
forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a
runReader (NetConfig -> Maybe NetConfig -> NetConfig
forall a. a -> Maybe a -> a
fromMaybe NetConfig
forall a. Default a => a
def Maybe NetConfig
net) (Sem (Reader NetConfig : Reader TmuxConfig : IOStack) ()
 -> Sem (Reader TmuxConfig : IOStack) ())
-> Sem (Reader NetConfig : Reader TmuxConfig : IOStack) ()
-> Sem (Reader TmuxConfig : IOStack) ()
forall a b. (a -> b) -> a -> b
$
  forall (r :: EffectRow).
Members '[Resource, Race, Async, Embed IO] r =>
InterpretersFor
  '[Events (OutChan XClipboardEvent) XClipboardEvent,
    ChanConsumer XClipboardEvent]
  r
forall e (r :: EffectRow).
Members '[Resource, Race, Async, Embed IO] r =>
InterpretersFor '[Events (OutChan e) e, ChanConsumer e] r
interpretEventsChan @XClipboardEvent (Sem
   (Append
      '[Events (OutChan XClipboardEvent) XClipboardEvent,
        ChanConsumer XClipboardEvent]
      (Reader NetConfig : Reader TmuxConfig : IOStack))
   ()
 -> Sem (Reader NetConfig : Reader TmuxConfig : IOStack) ())
-> Sem
     (Append
        '[Events (OutChan XClipboardEvent) XClipboardEvent,
          ChanConsumer XClipboardEvent]
        (Reader NetConfig : Reader TmuxConfig : IOStack))
     ()
-> Sem (Reader NetConfig : Reader TmuxConfig : IOStack) ()
forall a b. (a -> b) -> a -> b
$
  forall (r :: EffectRow).
Members '[Resource, Race, Async, Embed IO] r =>
InterpretersFor
  '[Events (OutChan Event) Event, ChanConsumer Event] r
forall e (r :: EffectRow).
Members '[Resource, Race, Async, Embed IO] r =>
InterpretersFor '[Events (OutChan e) e, ChanConsumer e] r
interpretEventsChan @Event (Sem
   (Append
      '[Events (OutChan Event) Event, ChanConsumer Event]
      (Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack))
   ()
 -> Sem
      (Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Append
        '[Events (OutChan Event) Event, ChanConsumer Event]
        (Events (OutChan XClipboardEvent) XClipboardEvent
           : ChanConsumer XClipboardEvent : Reader NetConfig
           : Reader TmuxConfig : IOStack))
     ()
-> Sem
     (Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Seq Event
-> InterpreterFor
     (AtomicState (Seq Event))
     (Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
forall a (r :: EffectRow).
Member (Embed IO) r =>
a -> InterpreterFor (AtomicState a) r
interpretAtomic Seq Event
forall a. Monoid a => a
mempty (Sem
   (AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Events (OutChan Event) Event
         : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Maybe Text
-> InterpreterFor
     (Reader InstanceName)
     (AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
forall (r :: EffectRow).
Members '[Error Text, Embed IO] r =>
Maybe Text -> InterpreterFor (Reader InstanceName) r
interpretInstanceName Maybe Text
name (Sem
   (Reader InstanceName
      : AtomicState (Seq Event) : Events (OutChan Event) Event
      : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Manager
     : Reader InstanceName : AtomicState (Seq Event)
     : Events (OutChan Event) Event : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall (r :: EffectRow).
Member (Embed IO) r =>
InterpreterFor Manager r
interpretManager (Sem
   (Manager
      : Reader InstanceName : AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Reader InstanceName
         : AtomicState (Seq Event) : Events (OutChan Event) Event
         : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Reader GtkState
     : Manager : Reader InstanceName : AtomicState (Seq Event)
     : Events (OutChan Event) Event : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall resource (r :: EffectRow).
Members
  '[Events resource XClipboardEvent, Log, Error Text, Race, Resource,
    Async, Embed IO, Final IO]
  r =>
InterpreterFor (Reader GtkState) r
listenXClipboard (Sem
   (Reader GtkState
      : Manager : Reader InstanceName : AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Manager
         : Reader InstanceName : AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Reader GtkState
        : Manager : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (XClipboard
     : Reader GtkState : Manager : Reader InstanceName
     : AtomicState (Seq Event) : Events (OutChan Event) Event
     : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (Reader GtkState
        : Manager : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall (r :: EffectRow).
Members '[Reader GtkState, Log, Embed IO, Final IO] r =>
InterpreterFor XClipboard r
interpretXClipboardGtk (Sem
   (XClipboard
      : Reader GtkState : Manager : Reader InstanceName
      : AtomicState (Seq Event) : Events (OutChan Event) Event
      : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Reader GtkState
         : Manager : Reader InstanceName : AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (XClipboard
        : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Reader GtkState
        : Manager : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Tagged AgentX Agent
     : XClipboard : Reader GtkState : Manager : Reader InstanceName
     : AtomicState (Seq Event) : Events (OutChan Event) Event
     : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (XClipboard
        : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall xr er (r :: EffectRow).
(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
   (Tagged AgentX Agent
      : XClipboard : Reader GtkState : Manager : Reader InstanceName
      : AtomicState (Seq Event) : Events (OutChan Event) Event
      : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (XClipboard
         : Reader GtkState : Manager : Reader InstanceName
         : AtomicState (Seq Event) : Events (OutChan Event) Event
         : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Tagged AgentX Agent
        : XClipboard : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (XClipboard
        : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Tagged AgentNet Agent
     : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
     : Reader InstanceName : AtomicState (Seq Event)
     : Events (OutChan Event) Event : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (Tagged AgentX Agent
        : XClipboard : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall (r :: EffectRow).
(Members '[Manager, Reader NetConfig] r,
 Members
   '[Log, Interrupt, Race, Resource, Async, Embed IO, Final IO] r) =>
InterpreterFor (Tagged AgentNet Agent) r
interpretAgentNet (Sem
   (Tagged AgentNet Agent
      : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
      : Reader InstanceName : AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Tagged AgentX Agent
         : XClipboard : Reader GtkState : Manager : Reader InstanceName
         : AtomicState (Seq Event) : Events (OutChan Event) Event
         : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Tagged AgentX Agent
        : XClipboard : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Tagged AgentTmux Agent
     : Tagged AgentNet Agent : Tagged AgentX Agent : XClipboard
     : Reader GtkState : Manager : Reader InstanceName
     : AtomicState (Seq Event) : Events (OutChan Event) Event
     : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall (r :: EffectRow).
Members
  '[Reader TmuxConfig, Log, Async, Race, Resource, Embed IO] r =>
InterpreterFor (Tagged AgentTmux Agent) r
interpretAgentTmux (Sem
   (Tagged AgentTmux Agent
      : Tagged AgentNet Agent : Tagged AgentX Agent : XClipboard
      : Reader GtkState : Manager : Reader InstanceName
      : AtomicState (Seq Event) : Events (OutChan Event) Event
      : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Tagged AgentNet Agent
         : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
         : Reader InstanceName : AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Tagged AgentTmux Agent
        : Tagged AgentNet Agent : Tagged AgentX Agent : XClipboard
        : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Maybe Int
-> InterpreterFor
     History
     (Tagged AgentTmux Agent
        : Tagged AgentNet Agent : Tagged AgentX Agent : XClipboard
        : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
forall (r :: EffectRow).
(Members Agents r,
 Members
   '[Reader InstanceName, AtomicState (Seq Event), ChronosTime, Log]
   r) =>
Maybe Int -> InterpreterFor History r
interpretHistory Maybe Int
maxHistory (Sem
   (History
      : Tagged AgentTmux Agent : Tagged AgentNet Agent
      : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
      : Reader InstanceName : AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Tagged AgentTmux Agent
         : Tagged AgentNet Agent : Tagged AgentX Agent : XClipboard
         : Reader GtkState : Manager : Reader InstanceName
         : AtomicState (Seq Event) : Events (OutChan Event) Event
         : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (History
        : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Tagged AgentTmux Agent
        : Tagged AgentNet Agent : Tagged AgentX Agent : XClipboard
        : Reader GtkState : Manager : Reader InstanceName
        : AtomicState (Seq Event) : Events (OutChan Event) Event
        : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Sync ServerReady
     : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
     : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
     : Reader InstanceName : AtomicState (Seq Event)
     : Events (OutChan Event) Event : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (History
        : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall d (r :: EffectRow).
Members '[Race, Embed IO] r =>
InterpreterFor (Sync d) r
interpretSync (Sem
   (Sync ServerReady
      : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
      : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
      : Reader InstanceName : AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (History
         : Tagged AgentTmux Agent : Tagged AgentNet Agent
         : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
         : Reader InstanceName : AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (History
        : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Sync ServerReady
     : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
     : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
     : Reader InstanceName : AtomicState (Seq Event)
     : Events (OutChan Event) Event : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall (r :: EffectRow) b a.
Members '[Resource, Race, Async] r =>
Sem r b -> Sem r a -> Sem r a
withAsync_ Sem
  (Sync ServerReady
     : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
     : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
     : Reader InstanceName : AtomicState (Seq Event)
     : Events (OutChan Event) Event : ChanConsumer Event
     : Events (OutChan XClipboardEvent) XClipboardEvent
     : ChanConsumer XClipboardEvent : Reader NetConfig
     : Reader TmuxConfig : IOStack)
  ()
forall (r :: EffectRow).
Members
  '[History, Reader NetConfig, Sync ServerReady, Log, Interrupt,
    Final IO]
  r =>
Sem r ()
serve (Sem
   (Sync ServerReady
      : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
      : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
      : Reader InstanceName : AtomicState (Seq Event)
      : Events (OutChan Event) Event : ChanConsumer Event
      : Events (OutChan XClipboardEvent) XClipboardEvent
      : ChanConsumer XClipboardEvent : Reader NetConfig
      : Reader TmuxConfig : IOStack)
   ()
 -> Sem
      (Sync ServerReady
         : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
         : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
         : Reader InstanceName : AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall a b. (a -> b) -> a -> b
$
  (Event
 -> Sem
      (Sync ServerReady
         : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
         : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
         : Reader InstanceName : AtomicState (Seq Event)
         : Events (OutChan Event) Event : ChanConsumer Event
         : Events (OutChan XClipboardEvent) XClipboardEvent
         : ChanConsumer XClipboardEvent : Reader NetConfig
         : Reader TmuxConfig : IOStack)
      ())
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall e token (r :: EffectRow).
Member (EventConsumer token e) r =>
(e -> Sem r ()) -> Sem r ()
Conc.subscribeLoop Event
-> Sem
     (Sync ServerReady
        : History : Tagged AgentTmux Agent : Tagged AgentNet Agent
        : Tagged AgentX Agent : XClipboard : Reader GtkState : Manager
        : Reader InstanceName : AtomicState (Seq Event)
        : Events (OutChan Event) Event : ChanConsumer Event
        : Events (OutChan XClipboardEvent) XClipboardEvent
        : ChanConsumer XClipboardEvent : Reader NetConfig
        : Reader TmuxConfig : IOStack)
     ()
forall (r :: EffectRow). Member History r => Event -> Sem r ()
History.receive

yankApp ::
  Config ->
  YankConfig ->
  Sem IOStack ()
yankApp :: Config -> YankConfig -> Sem IOStack ()
yankApp (Config Maybe Text
name Maybe TmuxConfig
_ Maybe NetConfig
net Maybe Int
_) YankConfig
yankConfig =
  Sem (Manager : IOStack) () -> Sem IOStack ()
forall (r :: EffectRow).
Member (Embed IO) r =>
InterpreterFor Manager r
interpretManager (Sem (Manager : IOStack) () -> Sem IOStack ())
-> Sem (Manager : IOStack) () -> Sem IOStack ()
forall a b. (a -> b) -> a -> b
$
  Maybe Text
-> InterpreterFor (Reader InstanceName) (Manager : IOStack)
forall (r :: EffectRow).
Members '[Error Text, Embed IO] r =>
Maybe Text -> InterpreterFor (Reader InstanceName) r
interpretInstanceName Maybe Text
name (Sem (Reader InstanceName : Manager : IOStack) ()
 -> Sem (Manager : IOStack) ())
-> Sem (Reader InstanceName : Manager : IOStack) ()
-> Sem (Manager : IOStack) ()
forall a b. (a -> b) -> a -> b
$
  NetConfig
-> Sem
     (Reader NetConfig : Reader InstanceName : Manager : IOStack) ()
-> Sem (Reader InstanceName : Manager : IOStack) ()
forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a
runReader (NetConfig -> Maybe NetConfig -> NetConfig
forall a. a -> Maybe a -> a
fromMaybe NetConfig
forall a. Default a => a
def Maybe NetConfig
net) (Sem
   (Reader NetConfig : Reader InstanceName : Manager : IOStack) ()
 -> Sem (Reader InstanceName : Manager : IOStack) ())
-> Sem
     (Reader NetConfig : Reader InstanceName : Manager : IOStack) ()
-> Sem (Reader InstanceName : Manager : IOStack) ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Client
     : Reader NetConfig : Reader InstanceName : Manager : IOStack)
  ()
-> Sem
     (Reader NetConfig : Reader InstanceName : Manager : IOStack) ()
forall (r :: EffectRow).
Members
  '[Manager, Reader NetConfig, Log, Error Text, Race, Embed IO] r =>
InterpreterFor Client r
interpretClientNet (Sem
   (Client
      : Reader NetConfig : Reader InstanceName : Manager : IOStack)
   ()
 -> Sem
      (Reader NetConfig : Reader InstanceName : Manager : IOStack) ())
-> Sem
     (Client
        : Reader NetConfig : Reader InstanceName : Manager : IOStack)
     ()
-> Sem
     (Reader NetConfig : Reader InstanceName : Manager : IOStack) ()
forall a b. (a -> b) -> a -> b
$
  YankConfig
-> Sem
     (Client
        : Reader NetConfig : Reader InstanceName : Manager : IOStack)
     ()
forall (r :: EffectRow).
Members
  '[Reader InstanceName, Client, ChronosTime, Error Text, Embed IO]
  r =>
YankConfig -> Sem r ()
yank YankConfig
yankConfig

runClient ::
  Members [Log, Error Text, Race, Embed IO] r =>
  Maybe NetConfig ->
  InterpretersFor [Client, Reader NetConfig, Manager] r
runClient :: Maybe NetConfig
-> InterpretersFor '[Client, Reader NetConfig, Manager] r
runClient Maybe NetConfig
net =
  Sem (Manager : r) a -> Sem r a
forall (r :: EffectRow).
Member (Embed IO) r =>
InterpreterFor Manager r
interpretManager (Sem (Manager : r) a -> Sem r a)
-> (Sem (Client : Reader NetConfig : Manager : r) a
    -> Sem (Manager : r) a)
-> Sem (Client : Reader NetConfig : Manager : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  NetConfig
-> Sem (Reader NetConfig : Manager : r) a -> Sem (Manager : r) a
forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a
runReader (NetConfig -> Maybe NetConfig -> NetConfig
forall a. a -> Maybe a -> a
fromMaybe NetConfig
forall a. Default a => a
def Maybe NetConfig
net) (Sem (Reader NetConfig : Manager : r) a -> Sem (Manager : r) a)
-> (Sem (Client : Reader NetConfig : Manager : r) a
    -> Sem (Reader NetConfig : Manager : r) a)
-> Sem (Client : Reader NetConfig : Manager : r) a
-> Sem (Manager : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem (Client : Reader NetConfig : Manager : r) a
-> Sem (Reader NetConfig : Manager : r) a
forall (r :: EffectRow).
Members
  '[Manager, Reader NetConfig, Log, Error Text, Race, Embed IO] r =>
InterpreterFor Client r
interpretClientNet

listApp ::
  Config ->
  ListConfig ->
  Sem IOStack ()
listApp :: Config -> ListConfig -> Sem IOStack ()
listApp (Config Maybe Text
_ Maybe TmuxConfig
_ Maybe NetConfig
net Maybe Int
_) ListConfig
listConfig =
  ListConfig
-> Sem (Reader ListConfig : IOStack) () -> Sem IOStack ()
forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a
runReader ListConfig
listConfig (Sem (Reader ListConfig : IOStack) () -> Sem IOStack ())
-> Sem (Reader ListConfig : IOStack) () -> Sem IOStack ()
forall a b. (a -> b) -> a -> b
$
  Maybe NetConfig
-> InterpretersFor
     '[Client, Reader NetConfig, Manager] (Reader ListConfig : IOStack)
forall (r :: EffectRow).
Members '[Log, Error Text, Race, Embed IO] r =>
Maybe NetConfig
-> InterpretersFor '[Client, Reader NetConfig, Manager] r
runClient Maybe NetConfig
net (Sem
   (Append
      '[Client, Reader NetConfig, Manager] (Reader ListConfig : IOStack))
   ()
 -> Sem (Reader ListConfig : IOStack) ())
-> Sem
     (Append
        '[Client, Reader NetConfig, Manager] (Reader ListConfig : IOStack))
     ()
-> Sem (Reader ListConfig : IOStack) ()
forall a b. (a -> b) -> a -> b
$
  Sem
  (Append
     '[Client, Reader NetConfig, Manager] (Reader ListConfig : IOStack))
  ()
forall (r :: EffectRow).
Members '[Reader ListConfig, Client, Error Text, Embed IO] r =>
Sem r ()
list

loadApp ::
  Config ->
  LoadConfig ->
  Sem IOStack ()
loadApp :: Config -> LoadConfig -> Sem IOStack ()
loadApp (Config Maybe Text
_ Maybe TmuxConfig
_ Maybe NetConfig
net Maybe Int
_) (LoadConfig Int
event) =
  Maybe NetConfig
-> InterpretersFor '[Client, Reader NetConfig, Manager] IOStack
forall (r :: EffectRow).
Members '[Log, Error Text, Race, Embed IO] r =>
Maybe NetConfig
-> InterpretersFor '[Client, Reader NetConfig, Manager] r
runClient Maybe NetConfig
net (Sem (Append '[Client, Reader NetConfig, Manager] IOStack) ()
 -> Sem IOStack ())
-> Sem (Append '[Client, Reader NetConfig, Manager] IOStack) ()
-> Sem IOStack ()
forall a b. (a -> b) -> a -> b
$
  (Sem (Client : Reader NetConfig : Manager : IOStack) Event
-> Sem (Client : Reader NetConfig : Manager : IOStack) ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Sem (Client : Reader NetConfig : Manager : IOStack) Event
 -> Sem (Client : Reader NetConfig : Manager : IOStack) ())
-> (Either Text Event
    -> Sem (Client : Reader NetConfig : Manager : IOStack) Event)
-> Either Text Event
-> Sem (Client : Reader NetConfig : Manager : IOStack) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either Text Event
-> Sem (Client : Reader NetConfig : Manager : IOStack) Event
forall e (r :: EffectRow) a.
Member (Error e) r =>
Either e a -> Sem r a
fromEither (Either Text Event
 -> Sem (Client : Reader NetConfig : Manager : IOStack) ())
-> Sem
     (Client : Reader NetConfig : Manager : IOStack) (Either Text Event)
-> Sem (Client : Reader NetConfig : Manager : IOStack) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Int
-> Sem
     (Client : Reader NetConfig : Manager : IOStack) (Either Text Event)
forall (r :: EffectRow).
Member Client r =>
Int -> Sem r (Either Text Event)
Client.load Int
event)

runCommand :: Config -> Command -> Sem IOStack ()
runCommand :: Config -> Command -> Sem IOStack ()
runCommand Config
config = \case
  Command
Listen ->
    Config -> Sem IOStack ()
listenApp Config
config
  Yank YankConfig
yankConf ->
    Config -> YankConfig -> Sem IOStack ()
yankApp Config
config YankConfig
yankConf
  List ListConfig
showConf ->
    Config -> ListConfig -> Sem IOStack ()
listApp Config
config ListConfig
showConf
  Load LoadConfig
loadConf ->
    Config -> LoadConfig -> Sem IOStack ()
loadApp Config
config LoadConfig
loadConf

defaultCommand :: Sem IOStack Command
defaultCommand :: Sem IOStack Command
defaultCommand = do
  Sem IOStack (Maybe (Either Text Char))
-> MilliSeconds
-> Sem IOStack (Maybe (Either Text Char))
-> Sem IOStack (Maybe (Either Text Char))
forall u (r :: EffectRow) a.
(TimeUnit u, Member Race r) =>
Sem r a -> u -> Sem r a -> Sem r a
Conc.timeout_ (Maybe (Either Text Char) -> Sem IOStack (Maybe (Either Text Char))
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe (Either Text Char)
forall a. Maybe a
Nothing) (Int64 -> MilliSeconds
MilliSeconds Int64
100) (Either Text Char -> Maybe (Either Text Char)
forall a. a -> Maybe a
Just (Either Text Char -> Maybe (Either Text Char))
-> Sem IOStack (Either Text Char)
-> Sem IOStack (Maybe (Either Text Char))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IO Char -> Sem IOStack (Either Text Char)
forall (r :: EffectRow) a.
Member (Embed IO) r =>
IO a -> Sem r (Either Text a)
tryAny (Handle -> IO Char
hLookAhead Handle
stdin)) Sem IOStack (Maybe (Either Text Char))
-> (Maybe (Either Text Char) -> Command) -> Sem IOStack Command
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \case
    Just (Right Char
_) -> YankConfig -> Command
Yank (Maybe Text -> YankConfig
YankConfig (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"cli"))
    Maybe (Either Text Char)
_ -> Command
Listen

withCliOptions :: Conf -> Maybe Command -> IO ()
withCliOptions :: Conf -> Maybe Command -> IO ()
withCliOptions (Conf Bool
verbose Maybe (Path Abs File)
file) Maybe Command
cmd =
  Bool -> Sem IOStack () -> IO ()
runIO Bool
verbose do
    Config
config <- Maybe (Path Abs File) -> Sem IOStack Config
forall (r :: EffectRow).
Members '[Log, Error Text, Embed IO] r =>
Maybe (Path Abs File) -> Sem r Config
findFileConfig Maybe (Path Abs File)
file
    Config -> Command -> Sem IOStack ()
runCommand Config
config (Command -> Sem IOStack ())
-> Sem IOStack Command -> Sem IOStack ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Sem IOStack Command
-> (Command -> Sem IOStack Command)
-> Maybe Command
-> Sem IOStack Command
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Sem IOStack Command
defaultCommand Command -> Sem IOStack Command
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Command
cmd

app :: IO ()
app :: IO ()
app = do
  (Conf
conf, Maybe Command
cmd) <- ParserPrefs
-> ParserInfo (Conf, Maybe Command) -> IO (Conf, Maybe Command)
forall a. ParserPrefs -> ParserInfo a -> IO a
customExecParser ParserPrefs
parserPrefs (Parser (Conf, Maybe Command)
-> InfoMod (Conf, Maybe Command)
-> ParserInfo (Conf, Maybe Command)
forall a. Parser a -> InfoMod a -> ParserInfo a
info (Parser (Conf, Maybe Command)
parser Parser (Conf, Maybe Command)
-> Parser ((Conf, Maybe Command) -> (Conf, Maybe Command))
-> Parser (Conf, Maybe Command)
forall (f :: * -> *) a b. Applicative f => f a -> f (a -> b) -> f b
<**> Parser ((Conf, Maybe Command) -> (Conf, Maybe Command))
forall a. Parser (a -> a)
helper) InfoMod (Conf, Maybe Command)
forall a. InfoMod a
desc)
  Conf -> Maybe Command -> IO ()
withCliOptions Conf
conf Maybe Command
cmd
  where
    parserPrefs :: ParserPrefs
parserPrefs =
      PrefsMod -> ParserPrefs
prefs (PrefsMod
showHelpOnEmpty PrefsMod -> PrefsMod -> PrefsMod
forall a. Semigroup a => a -> a -> a
<> PrefsMod
showHelpOnError)
    desc :: InfoMod a
desc =
      InfoMod a
forall a. InfoMod a
fullDesc InfoMod a -> InfoMod a -> InfoMod a
forall a. Semigroup a => a -> a -> a
<> String -> InfoMod a
forall a. String -> InfoMod a
header String
"Helic is a clipboard synchronization tool."