module Chiasma.Interpreter.TmuxClient where import Conc (interpretAtomic) import Data.Sequence ((|>)) import qualified Data.Text as Text import Exon (exon) import qualified Log as Log import Path (Abs, File, Path, relfile, toFilePath) import Polysemy.Process.Interpreter.Process (ProcessQueues) import qualified Process as Process import Process ( OutputPipe (Stderr, Stdout), Process, ProcessError, SystemProcess, SystemProcessError, SystemProcessScopeError, interpretProcessInputId, interpretProcessOutputLeft, interpretProcessOutputTextLines, interpretProcess_, interpretSystemProcessNative_, resolveExecutable, withProcess_, ) import System.Process.Typed (ProcessConfig, proc) import qualified Chiasma.Data.TmuxError as TmuxError import Chiasma.Data.TmuxError (TmuxError (NoExe)) import Chiasma.Data.TmuxNative (TmuxNative (TmuxNative)) import qualified Chiasma.Data.TmuxOutputBlock as TmuxOutputBlock import Chiasma.Data.TmuxOutputBlock (TmuxOutputBlock) import qualified Chiasma.Data.TmuxRequest as TmuxRequest import Chiasma.Data.TmuxRequest (TmuxRequest (TmuxRequest)) import Chiasma.Data.TmuxResponse (TmuxResponse (TmuxResponse)) import qualified Chiasma.Effect.TmuxClient as TmuxClient import Chiasma.Effect.TmuxClient (TmuxClient) import Chiasma.Interpreter.ProcessOutput (interpretProcessOutputTmuxBlock) type TmuxQueues = ProcessQueues (Either Text TmuxOutputBlock) Text type TmuxProc = Process ByteString (Either Text TmuxOutputBlock) validate :: TmuxRequest -> TmuxOutputBlock -> Either TmuxError TmuxResponse validate :: TmuxRequest -> TmuxOutputBlock -> Either TmuxError TmuxResponse validate TmuxRequest request = \case TmuxOutputBlock.Success [Text] a -> TmuxResponse -> Either TmuxError TmuxResponse forall a b. b -> Either a b Right ([Text] -> TmuxResponse TmuxResponse [Text] a) TmuxOutputBlock.Error [Text] a -> TmuxError -> Either TmuxError TmuxResponse forall a b. a -> Either a b Left (TmuxRequest -> [Text] -> TmuxError TmuxError.RequestFailed TmuxRequest request [Text] a) tmuxRequest :: Members [Process ByteString (Either Text TmuxOutputBlock), Log, Stop TmuxError] r => TmuxRequest -> Sem r TmuxResponse tmuxRequest :: forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), Log, Stop TmuxError] r => TmuxRequest -> Sem r TmuxResponse tmuxRequest TmuxRequest request = do Text -> Sem r () forall (r :: EffectRow). (HasCallStack, Member Log r) => Text -> Sem r () Log.trace [exon|tmux request: #{Text.stripEnd (decodeUtf8 cmdline)}|] ByteString -> Sem r () forall i o (r :: EffectRow). Member (Process i o) r => i -> Sem r () Process.send ByteString cmdline Sem r (Either Text TmuxOutputBlock) forall i o (r :: EffectRow). Member (Process i o) r => Sem r o Process.recv Sem r (Either Text TmuxOutputBlock) -> (Either Text TmuxOutputBlock -> Sem r TmuxResponse) -> Sem r TmuxResponse forall a b. Sem r a -> (a -> Sem r b) -> Sem r b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= \case Left Text err -> TmuxError -> Sem r TmuxResponse forall e (r :: EffectRow) a. Member (Stop e) r => e -> Sem r a stop (TmuxRequest -> [Text] -> TmuxError TmuxError.RequestFailed TmuxRequest request [Text Item [Text] err]) Right TmuxOutputBlock block -> do Text -> Sem r () forall (r :: EffectRow). (HasCallStack, Member Log r) => Text -> Sem r () Log.trace [exon|tmux response: #{show block}|] Either TmuxError TmuxResponse -> Sem r TmuxResponse forall err (r :: EffectRow) a. Member (Stop err) r => Either err a -> Sem r a stopEither (TmuxRequest -> TmuxOutputBlock -> Either TmuxError TmuxResponse validate TmuxRequest request TmuxOutputBlock block) where cmdline :: ByteString cmdline = TmuxRequest -> ByteString TmuxRequest.encode TmuxRequest request socketArg :: Path Abs File -> [String] socketArg :: Path Abs File -> [String] socketArg Path Abs File socket = [String Item [String] "-S", Path Abs File -> String forall b t. Path b t -> String toFilePath Path Abs File socket] tmuxProc :: TmuxNative -> ProcessConfig () () () tmuxProc :: TmuxNative -> ProcessConfig () () () tmuxProc (TmuxNative Path Abs File exe Maybe (Path Abs File) socket) = String -> [String] -> ProcessConfig () () () proc (Path Abs File -> String forall b t. Path b t -> String toFilePath Path Abs File exe) ((Path Abs File -> [String]) -> Maybe (Path Abs File) -> [String] forall m a. Monoid m => (a -> m) -> Maybe a -> m forall (t :: * -> *) m a. (Foldable t, Monoid m) => (a -> m) -> t a -> m foldMap Path Abs File -> [String] socketArg Maybe (Path Abs File) socket [String] -> [String] -> [String] forall a. Semigroup a => a -> a -> a <> [String Item [String] "-C", String Item [String] "-u", String Item [String] "attach-session", String Item [String] "-f", String Item [String] "ignore-size"]) interpretSystemProcessTmux :: Members [Reader TmuxNative, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r interpretSystemProcessTmux :: forall (r :: EffectRow). Members '[Reader TmuxNative, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r interpretSystemProcessTmux Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a sem = do ProcessConfig () () () conf <- TmuxNative -> ProcessConfig () () () tmuxProc (TmuxNative -> ProcessConfig () () ()) -> Sem r TmuxNative -> Sem r (ProcessConfig () () ()) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> Sem r TmuxNative forall i (r :: EffectRow). Member (Reader i) r => Sem r i ask ProcessConfig () () () -> InterpreterFor (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r forall (r :: EffectRow). Members '[Resource, Embed IO] r => ProcessConfig () () () -> InterpreterFor (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r interpretSystemProcessNative_ ProcessConfig () () () conf Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a sem interpretProcessTmux :: Member (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r => Members [Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ TmuxProc !! ProcessError) r interpretProcessTmux :: forall (r :: EffectRow). (Member (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r, Members '[Resource, Race, Async, Embed IO] r) => InterpreterFor (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) r interpretProcessTmux Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : r) a sem = do forall (p :: OutputPipe) (r :: EffectRow). Member (Embed IO) r => InterpreterFor (ProcessOutput p (Either Text TmuxOutputBlock)) r interpretProcessOutputTmuxBlock @'Stdout (Sem (ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem r a) -> Sem (ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem r a forall a b. (a -> b) -> a -> b $ forall (p :: OutputPipe) (r :: EffectRow) a. Sem (ProcessOutput p Text : r) a -> Sem r a interpretProcessOutputTextLines @'Stderr (Sem (ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a) -> Sem (ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a forall a b. (a -> b) -> a -> b $ forall (p :: OutputPipe) a b (r :: EffectRow). Member (ProcessOutput p a) r => InterpreterFor (ProcessOutput p (Either a b)) r interpretProcessOutputLeft @'Stderr (Sem (ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a) -> Sem (ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a forall a b. (a -> b) -> a -> b $ Sem (ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a forall (r :: EffectRow) a. Sem (ProcessInput ByteString : r) a -> Sem r a interpretProcessInputId (Sem (ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a) -> Sem (ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a forall a b. (a -> b) -> a -> b $ ProcessOptions -> InterpreterFor (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) (ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) forall i o (r :: EffectRow). (Member (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r, Members '[ProcessOutput 'Stdout o, ProcessOutput 'Stderr o, ProcessInput i, Resource, Race, Async, Embed IO] r) => ProcessOptions -> InterpreterFor (Scoped_ (Process i o) !! ProcessError) r interpretProcess_ ProcessOptions forall a. Default a => a def (Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a) -> Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a -> Sem (ProcessInput ByteString : ProcessOutput 'Stderr (Either Text TmuxOutputBlock) : ProcessOutput 'Stderr Text : ProcessOutput 'Stdout (Either Text TmuxOutputBlock) : r) a forall a b. (a -> b) -> a -> b $ forall (index :: Nat) (inserted :: EffectRow) (head :: EffectRow) (oldTail :: EffectRow) (tail :: EffectRow) (old :: EffectRow) (full :: EffectRow) a. (ListOfLength index head, WhenStuck index InsertAtUnprovidedIndex, old ~ Append head oldTail, tail ~ Append inserted oldTail, full ~ Append head tail, InsertAtIndex index head tail oldTail full inserted) => Sem old a -> Sem full a insertAt @1 Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : r) a sem {-# inline interpretProcessTmux #-} flush :: Members [TmuxProc, AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem r () flush :: forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem r () flush = (TmuxRequest -> Sem r TmuxResponse) -> Seq TmuxRequest -> Sem r () forall (t :: * -> *) (f :: * -> *) a b. (Foldable t, Applicative f) => (a -> f b) -> t a -> f () traverse_ TmuxRequest -> Sem r TmuxResponse forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), Log, Stop TmuxError] r => TmuxRequest -> Sem r TmuxResponse tmuxRequest (Seq TmuxRequest -> Sem r ()) -> Sem r (Seq TmuxRequest) -> Sem r () forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< (Seq TmuxRequest -> (Seq TmuxRequest, Seq TmuxRequest)) -> Sem r (Seq TmuxRequest) forall s a (r :: EffectRow). Member (AtomicState s) r => (s -> (s, a)) -> Sem r a atomicState' (Seq TmuxRequest forall a. Monoid a => a mempty,) tmuxSession :: ∀ r a . Members [Scoped_ TmuxProc !! ProcessError, AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem (TmuxProc : r) a -> Sem r a tmuxSession :: forall (r :: EffectRow) a. Members '[Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError, AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem (Process ByteString (Either Text TmuxOutputBlock) : r) a -> Sem r a tmuxSession Sem (Process ByteString (Either Text TmuxOutputBlock) : r) a action = forall err (eff :: (* -> *) -> * -> *) err' (r :: EffectRow) a. Members '[Resumable err eff, Stop err'] r => (err -> err') -> Sem (eff : r) a -> Sem r a resumeHoist @ProcessError @(Scoped_ TmuxProc) ProcessError -> TmuxError TmuxError.ProcessFailed (Sem (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a -> Sem r a) -> Sem (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a -> Sem r a forall a b. (a -> b) -> a -> b $ Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a -> Sem (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a InterpreterFor (Process ByteString (Either Text TmuxOutputBlock)) (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) forall i o (r :: EffectRow). Member (Scoped_ (Process i o)) r => InterpreterFor (Process i o) r withProcess_ do Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) (Either Text TmuxOutputBlock) -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) () forall (f :: * -> *) a. Functor f => f a -> f () void Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) (Either Text TmuxOutputBlock) forall i o (r :: EffectRow). Member (Process i o) r => Sem r o Process.recv TmuxRequest -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) TmuxResponse forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), Log, Stop TmuxError] r => TmuxRequest -> Sem r TmuxResponse tmuxRequest (Text -> [Text] -> Maybe TmuxQuery -> TmuxRequest TmuxRequest Text "refresh-client" [Text Item [Text] "-C", Text Item [Text] "10000x10000"] Maybe TmuxQuery forall a. Maybe a Nothing) Sem (Process ByteString (Either Text TmuxOutputBlock) : r) a -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *) (r :: EffectRow) a. Sem (e1 : r) a -> Sem (e1 : e2 : r) a raiseUnder Sem (Process ByteString (Either Text TmuxOutputBlock) : r) a action Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) () -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a forall a b. Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) b -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) a forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a <* Sem (Process ByteString (Either Text TmuxOutputBlock) : Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) : r) () forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem r () flush interpretTmuxProcessBuffered :: Members [AtomicState (Seq TmuxRequest), Scoped_ TmuxProc !! ProcessError, Log, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxProcessBuffered :: forall (r :: EffectRow). Members '[AtomicState (Seq TmuxRequest), Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError, Log, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxProcessBuffered = forall (extra :: EffectRow) param (effect :: (* -> *) -> * -> *) err (r :: EffectRow). KnownList extra => (forall (q :: (* -> *) -> * -> *) x. param -> Sem (extra ++ (Stop err : Opaque q : r)) x -> Sem (Stop err : Opaque q : r) x) -> (forall (q :: (* -> *) -> * -> *) (r0 :: EffectRow) x. effect (Sem r0) x -> Sem (extra ++ (Stop err : Opaque q : r)) x) -> InterpreterFor (Scoped param effect !! err) r interpretScopedResumableWith_ @'[TmuxProc] ((Sem (Process ByteString (Either Text TmuxOutputBlock) : Stop TmuxError : Opaque q : r) x -> Sem (Stop TmuxError : Opaque q : r) x) -> () -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Stop TmuxError : Opaque q : r) x -> Sem (Stop TmuxError : Opaque q : r) x forall a b. a -> b -> a const Sem (Process ByteString (Either Text TmuxOutputBlock) : Stop TmuxError : Opaque q : r) x -> Sem (Stop TmuxError : Opaque q : r) x forall (r :: EffectRow) a. Members '[Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError, AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem (Process ByteString (Either Text TmuxOutputBlock) : r) a -> Sem r a tmuxSession) \case TmuxClient.Schedule TmuxRequest request -> (Seq TmuxRequest -> Seq TmuxRequest) -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Stop TmuxError : Opaque q : r) () forall s (r :: EffectRow). Member (AtomicState s) r => (s -> s) -> Sem r () atomicModify' (Seq TmuxRequest -> TmuxRequest -> Seq TmuxRequest forall a. Seq a -> a -> Seq a |> TmuxRequest request) TmuxClient.Send TmuxRequest cmd -> do Sem (Process ByteString (Either Text TmuxOutputBlock) : Stop TmuxError : Opaque q : r) () forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), AtomicState (Seq TmuxRequest), Log, Stop TmuxError] r => Sem r () flush TmuxRequest -> Sem (Process ByteString (Either Text TmuxOutputBlock) : Stop TmuxError : Opaque q : r) TmuxResponse forall (r :: EffectRow). Members '[Process ByteString (Either Text TmuxOutputBlock), Log, Stop TmuxError] r => TmuxRequest -> Sem r TmuxResponse tmuxRequest TmuxRequest cmd {-# inline interpretTmuxProcessBuffered #-} interpretTmuxWithProcess :: Members [Scoped_ TmuxProc !! ProcessError, Log, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxWithProcess :: forall (r :: EffectRow). Members '[Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError, Log, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxWithProcess = Seq TmuxRequest -> InterpreterFor (AtomicState (Seq TmuxRequest)) r forall a (r :: EffectRow). Member (Embed IO) r => a -> InterpreterFor (AtomicState a) r interpretAtomic Seq TmuxRequest forall a. Monoid a => a mempty (Sem (AtomicState (Seq TmuxRequest) : r) a -> Sem r a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem (AtomicState (Seq TmuxRequest) : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem r a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : AtomicState (Seq TmuxRequest) : r) a -> Sem (AtomicState (Seq TmuxRequest) : r) a forall (r :: EffectRow). Members '[AtomicState (Seq TmuxRequest), Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError, Log, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) (AtomicState (Seq TmuxRequest) : r) interpretTmuxProcessBuffered (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : AtomicState (Seq TmuxRequest) : r) a -> Sem (AtomicState (Seq TmuxRequest) : r) a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : AtomicState (Seq TmuxRequest) : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem (AtomicState (Seq TmuxRequest) : r) a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : AtomicState (Seq TmuxRequest) : r) a forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *) (r :: EffectRow) a. Sem (e1 : r) a -> Sem (e1 : e2 : r) a raiseUnder {-# inline interpretTmuxWithProcess #-} interpretTmuxNative :: ∀ r . Members [Reader TmuxNative, Log, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxNative :: forall (r :: EffectRow). Members '[Reader TmuxNative, Log, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxNative = Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a -> Sem r a forall (r :: EffectRow). Members '[Reader TmuxNative, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r InterpreterFor (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r interpretSystemProcessTmux (Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a -> Sem r a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem r a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a -> Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a forall (r :: EffectRow). (Member (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) r, Members '[Resource, Race, Async, Embed IO] r) => InterpreterFor (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) r InterpreterFor (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) interpretProcessTmux (Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a -> Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a -> Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a forall (r :: EffectRow). Members '[Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError, Log, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) interpretTmuxWithProcess (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a -> Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : (Scoped_ (Process ByteString (Either Text TmuxOutputBlock)) !! ProcessError) : (Scoped_ (SystemProcess !! SystemProcessError) !! SystemProcessScopeError) : r) a forall (e2 :: (* -> *) -> * -> *) (e3 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *) (r :: EffectRow) a. Sem (e1 : r) a -> Sem (e1 : e2 : e3 : r) a raiseUnder2 {-# inline interpretTmuxNative #-} interpretTmuxFailing :: TmuxError -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxFailing :: forall (r :: EffectRow). TmuxError -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxFailing TmuxError err = (forall (q :: (* -> *) -> * -> *). () -> Sem (Stop TmuxError : Opaque q : r) ()) -> (forall (q :: (* -> *) -> * -> *) (r0 :: EffectRow) x. () -> TmuxClient TmuxRequest TmuxResponse (Sem r0) x -> Sem (Stop TmuxError : Opaque q : r) x) -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r forall param resource (effect :: (* -> *) -> * -> *) err (r :: EffectRow). (forall (q :: (* -> *) -> * -> *). param -> Sem (Stop err : Opaque q : r) resource) -> (forall (q :: (* -> *) -> * -> *) (r0 :: EffectRow) x. resource -> effect (Sem r0) x -> Sem (Stop err : Opaque q : r) x) -> InterpreterFor (Scoped param effect !! err) r interpretScopedResumable_ () -> Sem (Stop TmuxError : Opaque q : r) () forall a. Monoid a => a forall (q :: (* -> *) -> * -> *). () -> Sem (Stop TmuxError : Opaque q : r) () mempty \ () -> \case TmuxClient.Schedule TmuxRequest _ -> TmuxError -> Sem (Stop TmuxError : Opaque q : r) x forall e (r :: EffectRow) a. Member (Stop e) r => e -> Sem r a stop TmuxError err TmuxClient.Send TmuxRequest _ -> TmuxError -> Sem (Stop TmuxError : Opaque q : r) x forall e (r :: EffectRow) a. Member (Stop e) r => e -> Sem r a stop TmuxError err withTmuxNativeEnv :: Member (Embed IO) r => Maybe (Path Abs File) -> (Maybe TmuxNative -> Sem r a) -> Sem r a withTmuxNativeEnv :: forall (r :: EffectRow) a. Member (Embed IO) r => Maybe (Path Abs File) -> (Maybe TmuxNative -> Sem r a) -> Sem r a withTmuxNativeEnv Maybe (Path Abs File) socket Maybe TmuxNative -> Sem r a use = Maybe TmuxNative -> Sem r a use (Maybe TmuxNative -> Sem r a) -> (Either Text (Path Abs File) -> Maybe TmuxNative) -> Either Text (Path Abs File) -> Sem r a forall b c a. (b -> c) -> (a -> b) -> a -> c . (Path Abs File -> TmuxNative) -> Maybe (Path Abs File) -> Maybe TmuxNative forall a b. (a -> b) -> Maybe a -> Maybe b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ((Path Abs File -> Maybe (Path Abs File) -> TmuxNative) -> Maybe (Path Abs File) -> Path Abs File -> TmuxNative forall a b c. (a -> b -> c) -> b -> a -> c flip Path Abs File -> Maybe (Path Abs File) -> TmuxNative TmuxNative Maybe (Path Abs File) socket) (Maybe (Path Abs File) -> Maybe TmuxNative) -> (Either Text (Path Abs File) -> Maybe (Path Abs File)) -> Either Text (Path Abs File) -> Maybe TmuxNative forall b c a. (b -> c) -> (a -> b) -> a -> c . Either Text (Path Abs File) -> Maybe (Path Abs File) forall l r. Either l r -> Maybe r rightToMaybe (Either Text (Path Abs File) -> Sem r a) -> Sem r (Either Text (Path Abs File)) -> Sem r a forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b =<< Path Rel File -> Maybe (Path Abs File) -> Sem r (Either Text (Path Abs File)) forall (r :: EffectRow). Member (Embed IO) r => Path Rel File -> Maybe (Path Abs File) -> Sem r (Either Text (Path Abs File)) resolveExecutable [relfile|tmux|] Maybe (Path Abs File) forall a. Maybe a Nothing runReaderTmuxNativeEnv :: Members [Error TmuxError, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Reader TmuxNative) r runReaderTmuxNativeEnv :: forall (r :: EffectRow). Members '[Error TmuxError, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Reader TmuxNative) r runReaderTmuxNativeEnv Maybe (Path Abs File) socket Sem (Reader TmuxNative : r) a sem = do TmuxNative tn <- Maybe (Path Abs File) -> (Maybe TmuxNative -> Sem r TmuxNative) -> Sem r TmuxNative forall (r :: EffectRow) a. Member (Embed IO) r => Maybe (Path Abs File) -> (Maybe TmuxNative -> Sem r a) -> Sem r a withTmuxNativeEnv Maybe (Path Abs File) socket (TmuxError -> Maybe TmuxNative -> Sem r TmuxNative forall e (r :: EffectRow) a. Member (Error e) r => e -> Maybe a -> Sem r a note TmuxError NoExe) TmuxNative -> Sem (Reader TmuxNative : r) a -> Sem r a forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a runReader TmuxNative tn Sem (Reader TmuxNative : r) a sem {-# inline runReaderTmuxNativeEnv #-} interpretTmuxNativeEnv :: Members [Error TmuxError, Log, Resource, Race, Async, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxNativeEnv :: forall (r :: EffectRow). Members '[Error TmuxError, Log, Resource, Race, Async, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxNativeEnv Maybe (Path Abs File) socket = Maybe (Path Abs File) -> InterpreterFor (Reader TmuxNative) r forall (r :: EffectRow). Members '[Error TmuxError, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Reader TmuxNative) r runReaderTmuxNativeEnv Maybe (Path Abs File) socket (Sem (Reader TmuxNative : r) a -> Sem r a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem (Reader TmuxNative : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem r a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : Reader TmuxNative : r) a -> Sem (Reader TmuxNative : r) a forall (r :: EffectRow). Members '[Reader TmuxNative, Log, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) (Reader TmuxNative : r) interpretTmuxNative (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : Reader TmuxNative : r) a -> Sem (Reader TmuxNative : r) a) -> (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : Reader TmuxNative : r) a) -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem (Reader TmuxNative : r) a forall b c a. (b -> c) -> (a -> b) -> a -> c . Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : Reader TmuxNative : r) a forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *) (r :: EffectRow) a. Sem (e1 : r) a -> Sem (e1 : e2 : r) a raiseUnder {-# inline interpretTmuxNativeEnv #-} interpretTmuxNativeEnvGraceful :: Members [Log, Resource, Race, Async, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxNativeEnvGraceful :: forall (r :: EffectRow). Members '[Log, Resource, Race, Async, Embed IO] r => Maybe (Path Abs File) -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxNativeEnvGraceful Maybe (Path Abs File) socket Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a sem = Maybe (Path Abs File) -> (Maybe TmuxNative -> Sem r a) -> Sem r a forall (r :: EffectRow) a. Member (Embed IO) r => Maybe (Path Abs File) -> (Maybe TmuxNative -> Sem r a) -> Sem r a withTmuxNativeEnv Maybe (Path Abs File) socket \case Just TmuxNative tn -> TmuxNative -> Sem (Reader TmuxNative : r) a -> Sem r a forall i (r :: EffectRow) a. i -> Sem (Reader i : r) a -> Sem r a runReader TmuxNative tn (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : Reader TmuxNative : r) a -> Sem (Reader TmuxNative : r) a forall (r :: EffectRow). Members '[Reader TmuxNative, Log, Resource, Race, Async, Embed IO] r => InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) (Reader TmuxNative : r) interpretTmuxNative (Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a -> Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : Reader TmuxNative : r) a forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *) (r :: EffectRow) a. Sem (e1 : r) a -> Sem (e1 : e2 : r) a raiseUnder Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a sem)) Maybe TmuxNative Nothing -> TmuxError -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r forall (r :: EffectRow). TmuxError -> InterpreterFor (Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) r interpretTmuxFailing TmuxError NoExe Sem ((Scoped_ (TmuxClient TmuxRequest TmuxResponse) !! TmuxError) : r) a sem {-# inline interpretTmuxNativeEnvGraceful #-} interpretTmuxClientNull :: InterpreterFor (Scoped_ (TmuxClient i ()) !! TmuxError) r interpretTmuxClientNull :: forall i (r :: EffectRow) a. Sem ((Scoped_ (TmuxClient i ()) !! TmuxError) : r) a -> Sem r a interpretTmuxClientNull = (forall (q :: (* -> *) -> * -> *). () -> Sem (Stop TmuxError : Opaque q : r) ()) -> (forall (q :: (* -> *) -> * -> *) (r0 :: EffectRow) x. () -> TmuxClient i () (Sem r0) x -> Sem (Stop TmuxError : Opaque q : r) x) -> InterpreterFor (Scoped () (TmuxClient i ()) !! TmuxError) r forall param resource (effect :: (* -> *) -> * -> *) err (r :: EffectRow). (forall (q :: (* -> *) -> * -> *). param -> Sem (Stop err : Opaque q : r) resource) -> (forall (q :: (* -> *) -> * -> *) (r0 :: EffectRow) x. resource -> effect (Sem r0) x -> Sem (Stop err : Opaque q : r) x) -> InterpreterFor (Scoped param effect !! err) r interpretScopedResumable_ () -> Sem (Stop TmuxError : Opaque q : r) () forall a. Monoid a => a forall (q :: (* -> *) -> * -> *). () -> Sem (Stop TmuxError : Opaque q : r) () mempty \ () -> \case TmuxClient.Schedule i _ -> Sem (Stop TmuxError : Opaque q : r) x Sem (Stop TmuxError : Opaque q : r) () forall (f :: * -> *). Applicative f => f () unit TmuxClient.Send i _ -> Sem (Stop TmuxError : Opaque q : r) x Sem (Stop TmuxError : Opaque q : r) () forall (f :: * -> *). Applicative f => f () unit {-# inline interpretTmuxClientNull #-}