module Chiasma.Monad.Simple(
  -- tmuxProcessConfig,
  -- tmuxProcess,
  -- interpret,
  -- runTmux,
) where

-- import GHC.IO.Exception (ExitCode(ExitSuccess))
-- import Control.Monad (when)
-- import Control.Monad.Free (foldFree)
-- import Control.Monad.IO.Class (MonadIO)
-- import Control.Monad.Trans.Except (ExceptT(ExceptT), catchE, runExceptT)
-- import qualified Data.ByteString.Lazy.Internal as B (unpackChars)
-- import Data.Functor (void)
-- import Data.List.Split (linesBy)
-- import System.Process.Typed (ProcessConfig, readProcessStdout, proc)
-- import UnliftIO (throwIO)
-- import Chiasma.Data.TmuxThunk (Cmd(..), CmdName(..), CmdArgs(..), Cmds(..), TmuxThunk(..), TmuxError(..))
-- import Chiasma.Monad.Tmux (TmuxProg)

-- tmuxProcessConfig :: CmdName -> CmdArgs -> ProcessConfig () () ()
-- tmuxProcessConfig (CmdName cmd) (CmdArgs args) =
--   proc "tmux" (["-C", cmd] ++ args)

-- tmuxProcess :: MonadIO m => Cmd -> m (Either TmuxError [String])
-- tmuxProcess cmd@(Cmd name args) = do
--   (code, out) <- readProcessStdout $ tmuxProcessConfig name args
--   let outLines = linesBy (=='\n') $ B.unpackChars out
--   return $ case code of
--     ExitSuccess -> Right outLines
--     _ -> Left $ TmuxProcessFailed (Cmds [cmd]) outLines

-- interpret :: MonadIO m => TmuxThunk a next -> ExceptT TmuxError m next
-- interpret (Read cmd next) = next <$> tmuxProcess cmd
-- interpret (Write cmd next) = next <$> void (tmuxProcess cmd)

-- runTmux :: MonadIO m => TmuxProg a next -> m (Either TmuxError next)
-- runTmux = runExceptT . foldFree interpret