module Chiasma.Tmux where

import Polysemy.Internal (hoistSem)
import Polysemy.Internal.Sing (KnownList (singList))
import Polysemy.Internal.Union (hoist, weakenMid)

import Chiasma.Data.Panes (Panes, TmuxPanes)
import Chiasma.Effect.Codec (Codec)
import Chiasma.Effect.TmuxApi (TmuxApi)
import Chiasma.Effect.TmuxClient (ScopedTmux, TmuxClient)
import Chiasma.Interpreter.TmuxApi (
  InterpretApis (interpretApis),
  RestopApis (restopApis),
  TmuxApis,
  interpretTmuxApi,
  type (<$>),
  )

withTmuxApis' ::
   commands err i o r a .
  InterpretApis commands err i o r =>
  Member (ScopedTmux i o) r =>
  Sem (TmuxApis commands err ++ TmuxClient i o : r) a ->
  Sem r a
withTmuxApis' :: forall (commands :: [* -> *]) err i o (r :: [(* -> *) -> * -> *])
       a.
(InterpretApis commands err i o r, Member (ScopedTmux i o) r) =>
Sem (TmuxApis commands err ++ (TmuxClient i o : r)) a -> Sem r a
withTmuxApis' =
  Sem (TmuxClient i o : r) a -> Sem r a
InterpreterFor (TmuxClient i o) r
forall (effect :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]).
Member (Scoped_ effect) r =>
InterpreterFor effect r
scoped_ (Sem (TmuxClient i o : r) a -> Sem r a)
-> (Sem
      (Append
         (Eval (FMap (TmuxApiEffect err) commands)) (TmuxClient i o : r))
      a
    -> Sem (TmuxClient i o : r) a)
-> Sem
     (Append
        (Eval (FMap (TmuxApiEffect err) commands)) (TmuxClient i o : r))
     a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (commands :: [* -> *]) err i o (r :: [(* -> *) -> * -> *]).
InterpretApis commands err i o r =>
InterpretersFor (TmuxApis commands err) (TmuxClient i o : r)
interpretApis @commands @err

insertAfter ::
   left e r a .
  KnownList left =>
  Sem (left ++ r) a ->
  Sem (left ++ e : r) a
insertAfter :: forall (left :: [(* -> *) -> * -> *]) (e :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
KnownList left =>
Sem (left ++ r) a -> Sem (left ++ (e : r)) a
insertAfter =
  (forall x.
 Union (left ++ r) (Sem (left ++ r)) x
 -> Union (left ++ (e : r)) (Sem (left ++ (e : r))) x)
-> Sem (left ++ r) a -> Sem (left ++ (e : r)) a
forall (r :: [(* -> *) -> * -> *]) (r' :: [(* -> *) -> * -> *]) a.
(forall x. Union r (Sem r) x -> Union r' (Sem r') x)
-> Sem r a -> Sem r' a
hoistSem ((forall x.
  Union (left ++ r) (Sem (left ++ r)) x
  -> Union (left ++ (e : r)) (Sem (left ++ (e : r))) x)
 -> Sem (left ++ r) a -> Sem (left ++ (e : r)) a)
-> (forall x.
    Union (left ++ r) (Sem (left ++ r)) x
    -> Union (left ++ (e : r)) (Sem (left ++ (e : r))) x)
-> Sem (left ++ r) a
-> Sem (left ++ (e : r)) a
forall a b. (a -> b) -> a -> b
$ (forall x. Sem (left ++ r) x -> Sem (left ++ (e : r)) x)
-> Union (left ++ (e : r)) (Sem (left ++ r)) x
-> Union (left ++ (e : r)) (Sem (left ++ (e : r))) x
forall (m :: * -> *) (n :: * -> *) (r :: [(* -> *) -> * -> *]) a.
(forall x. m x -> n x) -> Union r m a -> Union r n a
hoist (forall (left :: [(* -> *) -> * -> *]) (e :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
KnownList left =>
Sem (left ++ r) a -> Sem (left ++ (e : r)) a
insertAfter @left @e @r) (Union (left ++ (e : r)) (Sem (left ++ r)) x
 -> Union (left ++ (e : r)) (Sem (left ++ (e : r))) x)
-> (Union (left ++ r) (Sem (left ++ r)) x
    -> Union (left ++ (e : r)) (Sem (left ++ r)) x)
-> Union (left ++ r) (Sem (left ++ r)) x
-> Union (left ++ (e : r)) (Sem (left ++ (e : r))) x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (right :: [(* -> *) -> * -> *]) (m :: * -> *) a
       (left :: [(* -> *) -> * -> *]) (mid :: [(* -> *) -> * -> *]).
SList left
-> SList mid
-> Union (Append left right) m a
-> Union (Append left (Append mid right)) m a
weakenMid @r (forall (l :: [(* -> *) -> * -> *]). KnownList l => SList l
forall {k} (l :: [k]). KnownList l => SList l
singList @left) (forall (l :: [(* -> *) -> * -> *]). KnownList l => SList l
forall {k} (l :: [k]). KnownList l => SList l
singList @'[e])

withTmuxApis ::
   commands err i o r .
  KnownList (TmuxApis commands err) =>
  InterpretApis commands err i o r =>
  Member (ScopedTmux i o) r =>
  InterpretersFor (TmuxApis commands err) r
withTmuxApis :: forall (commands :: [* -> *]) err i o (r :: [(* -> *) -> * -> *]).
(KnownList (TmuxApis commands err),
 InterpretApis commands err i o r, Member (ScopedTmux i o) r) =>
InterpretersFor (TmuxApis commands err) r
withTmuxApis =
  Sem (TmuxClient i o : r) a -> Sem r a
InterpreterFor (TmuxClient i o) r
forall (effect :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]).
Member (Scoped_ effect) r =>
InterpreterFor effect r
scoped_ (Sem (TmuxClient i o : r) a -> Sem r a)
-> (Sem (Append (Eval (FMap (TmuxApiEffect err) commands)) r) a
    -> Sem (TmuxClient i o : r) a)
-> Sem (Append (Eval (FMap (TmuxApiEffect err) commands)) r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall (commands :: [* -> *]) err i o (r :: [(* -> *) -> * -> *]).
InterpretApis commands err i o r =>
InterpretersFor (TmuxApis commands err) (TmuxClient i o : r)
interpretApis @commands @err (Sem
   (Append
      (Eval (FMap (TmuxApiEffect err) commands)) (TmuxClient i o : r))
   a
 -> Sem (TmuxClient i o : r) a)
-> (Sem (Append (Eval (FMap (TmuxApiEffect err) commands)) r) a
    -> Sem
         (Append
            (Eval (FMap (TmuxApiEffect err) commands)) (TmuxClient i o : r))
         a)
-> Sem (Append (Eval (FMap (TmuxApiEffect err) commands)) r) a
-> Sem (TmuxClient i o : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall (left :: [(* -> *) -> * -> *]) (e :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
KnownList left =>
Sem (left ++ r) a -> Sem (left ++ (e : r)) a
insertAfter @(TmuxApis commands err) @(TmuxClient i o) @r

withTmuxApis_ ::
   commands err i o apis r .
  apis ~ TmuxApi <$> commands =>
  KnownList apis =>
  RestopApis commands err i o r =>
  Member (ScopedTmux i o) r =>
  InterpretersFor apis r
withTmuxApis_ :: forall {k} (commands :: [* -> *]) (err :: k) i o
       (apis :: [(* -> *) -> * -> *]) (r :: [(* -> *) -> * -> *]).
(apis ~ (TmuxApi <$> commands), KnownList apis,
 RestopApis commands err i o r, Member (ScopedTmux i o) r) =>
InterpretersFor apis r
withTmuxApis_ =
  Sem (TmuxClient i o : r) a -> Sem r a
InterpreterFor (TmuxClient i o) r
forall (effect :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]).
Member (Scoped_ effect) r =>
InterpreterFor effect r
scoped_ (Sem (TmuxClient i o : r) a -> Sem r a)
-> (Sem (Append apis r) a -> Sem (TmuxClient i o : r) a)
-> Sem (Append apis r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall (commands :: [* -> *]) (err :: k) i o
       (r :: [(* -> *) -> * -> *]).
RestopApis commands err i o r =>
InterpretersFor (TmuxApi <$> commands) (TmuxClient i o : r)
forall {k} (commands :: [* -> *]) (err :: k) i o
       (r :: [(* -> *) -> * -> *]).
RestopApis commands err i o r =>
InterpretersFor (TmuxApi <$> commands) (TmuxClient i o : r)
restopApis @commands @err (Sem (Append apis (TmuxClient i o : r)) a
 -> Sem (TmuxClient i o : r) a)
-> (Sem (Append apis r) a
    -> Sem (Append apis (TmuxClient i o : r)) a)
-> Sem (Append apis r) a
-> Sem (TmuxClient i o : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall (left :: [(* -> *) -> * -> *]) (e :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
KnownList left =>
Sem (left ++ r) a -> Sem (left ++ (e : r)) a
insertAfter @apis @(TmuxClient i o) @r

withTmux ::
   command err i o r .
  Members [ScopedTmux i o, Codec command i o !! err] r =>
  InterpreterFor (TmuxApi command !! err) r
withTmux :: forall (command :: * -> *) err i o (r :: [(* -> *) -> * -> *]).
Members '[ScopedTmux i o, Codec command i o !! err] r =>
InterpreterFor (TmuxApi command !! err) r
withTmux =
  Sem (TmuxClient i o : r) a -> Sem r a
InterpreterFor (TmuxClient i o) r
forall (effect :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]).
Member (Scoped_ effect) r =>
InterpreterFor effect r
scoped_ (Sem (TmuxClient i o : r) a -> Sem r a)
-> (Sem ((TmuxApi command !! err) : r) a
    -> Sem (TmuxClient i o : r) a)
-> Sem ((TmuxApi command !! err) : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem ((TmuxApi command !! err) : TmuxClient i o : r) a
-> Sem (TmuxClient i o : r) a
InterpreterFor (TmuxApi command !! err) (TmuxClient i o : r)
forall (command :: * -> *) i o err (r :: [(* -> *) -> * -> *]).
Members '[TmuxClient i o, Codec command i o !! err] r =>
InterpreterFor (TmuxApi command !! err) r
interpretTmuxApi (Sem ((TmuxApi command !! err) : TmuxClient i o : r) a
 -> Sem (TmuxClient i o : r) a)
-> (Sem ((TmuxApi command !! err) : r) a
    -> Sem ((TmuxApi command !! err) : TmuxClient i o : r) a)
-> Sem ((TmuxApi command !! err) : r) a
-> Sem (TmuxClient i o : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sem ((TmuxApi command !! err) : r) a
-> Sem ((TmuxApi command !! err) : TmuxClient i o : r) a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder

withTmux_ ::
   command err i o r .
  Members [ScopedTmux i o, Codec command i o !! err, Stop err] r =>
  InterpreterFor (TmuxApi command) r
withTmux_ :: forall (command :: * -> *) err i o (r :: [(* -> *) -> * -> *]).
Members '[ScopedTmux i o, Codec command i o !! err, Stop err] r =>
InterpreterFor (TmuxApi command) r
withTmux_ =
  Sem (TmuxClient i o : r) a -> Sem r a
InterpreterFor (TmuxClient i o) r
forall (effect :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]).
Member (Scoped_ effect) r =>
InterpreterFor effect r
scoped_ (Sem (TmuxClient i o : r) a -> Sem r a)
-> (Sem (TmuxApi command : r) a -> Sem (TmuxClient i o : r) a)
-> Sem (TmuxApi command : r) a
-> Sem r a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem (Resumable err (TmuxApi command) : TmuxClient i o : r) a
-> Sem (TmuxClient i o : r) a
InterpreterFor
  (Resumable err (TmuxApi command)) (TmuxClient i o : r)
forall (command :: * -> *) i o err (r :: [(* -> *) -> * -> *]).
Members '[TmuxClient i o, Codec command i o !! err] r =>
InterpreterFor (TmuxApi command !! err) r
interpretTmuxApi (Sem (Resumable err (TmuxApi command) : TmuxClient i o : r) a
 -> Sem (TmuxClient i o : r) a)
-> (Sem (TmuxApi command : r) a
    -> Sem (Resumable err (TmuxApi command) : TmuxClient i o : r) a)
-> Sem (TmuxApi command : r) a
-> Sem (TmuxClient i o : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem (Resumable err (TmuxApi command) : r) a
-> Sem (Resumable err (TmuxApi command) : TmuxClient i o : r) a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder (Sem (Resumable err (TmuxApi command) : r) a
 -> Sem (Resumable err (TmuxApi command) : TmuxClient i o : r) a)
-> (Sem (TmuxApi command : r) a
    -> Sem (Resumable err (TmuxApi command) : r) a)
-> Sem (TmuxApi command : r) a
-> Sem (Resumable err (TmuxApi command) : TmuxClient i o : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall err (eff :: (* -> *) -> * -> *) (r :: [(* -> *) -> * -> *]).
Members '[Resumable err eff, Stop err] r =>
InterpreterFor eff r
restop @err @(TmuxApi command) (Sem (TmuxApi command : Resumable err (TmuxApi command) : r) a
 -> Sem (Resumable err (TmuxApi command) : r) a)
-> (Sem (TmuxApi command : r) a
    -> Sem (TmuxApi command : Resumable err (TmuxApi command) : r) a)
-> Sem (TmuxApi command : r) a
-> Sem (Resumable err (TmuxApi command) : r) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  Sem (TmuxApi command : r) a
-> Sem (TmuxApi command : Resumable err (TmuxApi command) : r) a
forall (e2 :: (* -> *) -> * -> *) (e1 :: (* -> *) -> * -> *)
       (r :: [(* -> *) -> * -> *]) a.
Sem (e1 : r) a -> Sem (e1 : e2 : r) a
raiseUnder

withPanes ::
   p err i o r .
  Members [ScopedTmux i o, Codec (Panes p) i o !! err] r =>
  InterpreterFor (TmuxPanes p !! err) r
withPanes :: forall p err i o (r :: [(* -> *) -> * -> *]).
Members '[ScopedTmux i o, Codec (Panes p) i o !! err] r =>
InterpreterFor (TmuxPanes p !! err) r
withPanes =
  Sem ((TmuxApi (Panes p) !! err) : r) a -> Sem r a
InterpreterFor (TmuxApi (Panes p) !! err) r
forall (command :: * -> *) err i o (r :: [(* -> *) -> * -> *]).
Members '[ScopedTmux i o, Codec command i o !! err] r =>
InterpreterFor (TmuxApi command !! err) r
withTmux

withPanes_ ::
   p err i o r .
  Members [ScopedTmux i o, Codec (Panes p) i o !! err, Stop err] r =>
  InterpreterFor (TmuxPanes p) r
withPanes_ :: forall p err i o (r :: [(* -> *) -> * -> *]).
Members
  '[ScopedTmux i o, Codec (Panes p) i o !! err, Stop err] r =>
InterpreterFor (TmuxPanes p) r
withPanes_ =
  Sem (TmuxApi (Panes p) : r) a -> Sem r a
InterpreterFor (TmuxApi (Panes p)) r
forall (command :: * -> *) err i o (r :: [(* -> *) -> * -> *]).
Members '[ScopedTmux i o, Codec command i o !! err, Stop err] r =>
InterpreterFor (TmuxApi command) r
withTmux_