module Ribosome.Tmux.Run where

import Chiasma.Data.TmuxError (TmuxError)
import Chiasma.Monad.Stream (TmuxProg)
import qualified Chiasma.Monad.Stream as Chiasma (runTmux)
import Chiasma.Native.Api (TmuxNative(TmuxNative))
import Control.Monad.Catch (MonadMask)
import Data.DeepPrisms (DeepPrisms)

import Ribosome.Config.Setting (settingMaybe)
import Ribosome.Config.Settings (tmuxSocket)
import Ribosome.Control.Monad.Ribo (MonadRibo, Nvim, Ribo)

runTmux ::
  MonadIO m =>
  MonadRibo m =>
  MonadBaseControl IO m =>
  MonadDeepError e TmuxError m =>
  MonadMask m =>
  Nvim m =>
  TmuxProg m a ->
  m a
runTmux :: TmuxProg m a -> m a
runTmux TmuxProg m a
prog = do
  Maybe FilePath
socket <- Setting FilePath -> m (Maybe FilePath)
forall (m :: * -> *) a.
(MonadIO m, Nvim m, MonadRibo m, MsgpackDecode a) =>
Setting a -> m (Maybe a)
settingMaybe Setting FilePath
tmuxSocket
  TmuxNative -> TmuxProg m a -> m a
forall (m :: * -> *) e api a.
(MonadIO m, MonadDeepError e TmuxError m, TmuxApi m api) =>
api -> TmuxProg m a -> m a
Chiasma.runTmux (Maybe FilePath -> TmuxNative
TmuxNative Maybe FilePath
socket) TmuxProg m a
prog

runTmuxE ::
  MonadIO m =>
  MonadRibo m =>
  MonadBaseControl IO m =>
  MonadMask m =>
  Nvim m =>
  TmuxProg (ExceptT TmuxError m) a ->
  m (Either TmuxError a)
runTmuxE :: TmuxProg (ExceptT TmuxError m) a -> m (Either TmuxError a)
runTmuxE =
  ExceptT TmuxError m a -> m (Either TmuxError a)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ExceptT TmuxError m a -> m (Either TmuxError a))
-> (TmuxProg (ExceptT TmuxError m) a -> ExceptT TmuxError m a)
-> TmuxProg (ExceptT TmuxError m) a
-> m (Either TmuxError a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TmuxProg (ExceptT TmuxError m) a -> ExceptT TmuxError m a
forall (m :: * -> *) e a.
(MonadIO m, MonadRibo m, MonadBaseControl IO m,
 MonadDeepError e TmuxError m, MonadMask m, Nvim m) =>
TmuxProg m a -> m a
runTmux

class RunTmux m where
  runRiboTmux :: TmuxProg m b -> m b

instance DeepPrisms e TmuxError => RunTmux (Ribo s e) where
    runRiboTmux :: TmuxProg (Ribo s e) b -> Ribo s e b
runRiboTmux = TmuxProg (Ribo s e) b -> Ribo s e b
forall (m :: * -> *) e a.
(MonadIO m, MonadRibo m, MonadBaseControl IO m,
 MonadDeepError e TmuxError m, MonadMask m, Nvim m) =>
TmuxProg m a -> m a
runTmux