module Chiasma.Monad.Tmux where

-- import Control.Monad.Free (liftF)
-- import Control.Monad.Free.Class (MonadFree)

-- import Chiasma.Codec (TmuxCodec, TmuxQuery(unQ))
-- import qualified Chiasma.Codec as TmuxCodec (TmuxCodec(decode, query))
-- import Chiasma.Data.Cmd (cmd)
-- import Chiasma.Data.TmuxError (TmuxError(InvalidOutput))
-- import Chiasma.Data.TmuxThunk (TmuxThunk(..))

-- read :: ∀ a m . (TmuxCodec a, MonadFree TmuxThunk m) => Text -> [Text] -> m [a]
-- read name args =
--   liftF $ Read (cmd name (args <> formatArgs)) TmuxCodec.decode id
--   where
--     formatArgs = ["-F", "'", unQ (TmuxCodec.query @a), "'"]

-- unsafeReadOne :: ∀ a m . (TmuxCodec a, MonadFree TmuxThunk m) => Text -> [Text] -> m a
-- unsafeReadOne name args = do
--   outputs <- read name args
--   case outputs of
--     [a] -> pure a
--     [] -> liftF $ Failed $ InvalidOutput "no data" (name <> unwords args)
--     _ -> liftF $ Failed $ InvalidOutput "multiple outputs for `unsafeReadOne`" (name <> unwords args)

-- readFirst :: ∀ a m . (TmuxCodec a, MonadFree TmuxThunk m) => Text -> [Text] -> m (Maybe a)
-- readFirst name args = do
--   outputs <- read name args
--   pure $ case outputs of
--     (a : _) -> Just a
--     [] -> Nothing

-- unsafeReadFirst :: ∀ a m . (TmuxCodec a, MonadFree TmuxThunk m) => Text -> [Text] -> m a
-- unsafeReadFirst name args = do
--   mayFirst <- readFirst name args
--   case mayFirst of
--     (Just a) -> pure a
--     Nothing -> liftF $ Failed $ InvalidOutput "no data" (name <> unwords args)

-- readRaw :: ∀ m . (MonadFree TmuxThunk m) => Text -> [Text] -> m [Text]
-- readRaw name args =
--   liftF $ Read (cmd name args) Right id

-- write :: MonadFree TmuxThunk m => Text -> [Text] -> m ()
-- write name args = liftF $ Write (cmd name args) id

-- flush :: MonadFree TmuxThunk m => m ()
-- flush =
--   liftF $ Flush id