module Chiasma.Command.Window where

import Control.Monad.Free.Class (MonadFree)

import Chiasma.Codec (TmuxCodec)
import Chiasma.Codec.Data (Pane, Window(Window))
import Chiasma.Data.Ident (Ident, identText)
import Chiasma.Data.TmuxId (SessionId, TmuxId(formatId), WindowId)
import Chiasma.Data.TmuxThunk (TmuxThunk)
import qualified Chiasma.Monad.Tmux as Tmux (read, unsafeReadFirst, unsafeReadOne)

sameId :: WindowId -> Window -> Bool
sameId :: WindowId -> Window -> Bool
sameId WindowId
target (Window WindowId
i Int
_ Int
_) = WindowId
target WindowId -> WindowId -> Bool
forall a. Eq a => a -> a -> Bool
== WindowId
i

windows :: MonadFree TmuxThunk m => m [Window]
windows :: m [Window]
windows =
  Text -> [Text] -> m [Window]
forall a (m :: * -> *).
(TmuxCodec a, MonadFree TmuxThunk m) =>
Text -> [Text] -> m [a]
Tmux.read Text
"list-windows" [Item [Text]
"-a"]

window :: MonadFree TmuxThunk m => WindowId -> m (Maybe Window)
window :: WindowId -> m (Maybe Window)
window WindowId
windowId =
  (Window -> Bool) -> [Window] -> Maybe Window
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (WindowId -> Window -> Bool
sameId WindowId
windowId) ([Window] -> Maybe Window) -> m [Window] -> m (Maybe Window)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m [Window]
forall (m :: * -> *). MonadFree TmuxThunk m => m [Window]
windows

sessionWindows :: MonadFree TmuxThunk m => SessionId -> m [Window]
sessionWindows :: SessionId -> m [Window]
sessionWindows SessionId
sid =
  Text -> [Text] -> m [Window]
forall a (m :: * -> *).
(TmuxCodec a, MonadFree TmuxThunk m) =>
Text -> [Text] -> m [a]
Tmux.read Text
"list-windows" [Item [Text]
"-t", SessionId -> Text
forall a. TmuxId a => a -> Text
formatId SessionId
sid]

newSessionWindow :: MonadFree TmuxThunk m => SessionId -> m Window
newSessionWindow :: SessionId -> m Window
newSessionWindow SessionId
sid =
  Text -> [Text] -> m Window
forall a (m :: * -> *).
(TmuxCodec a, MonadFree TmuxThunk m) =>
Text -> [Text] -> m a
Tmux.unsafeReadOne Text
"list-windows" [Item [Text]
"-t", SessionId -> Text
forall a. TmuxId a => a -> Text
formatId SessionId
sid]

doesWindowExist :: MonadFree TmuxThunk m => WindowId -> m Bool
doesWindowExist :: WindowId -> m Bool
doesWindowExist WindowId
windowId =
  (Window -> Bool) -> [Window] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (WindowId -> Window -> Bool
sameId WindowId
windowId) ([Window] -> Bool) -> m [Window] -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m [Window]
forall (m :: * -> *). MonadFree TmuxThunk m => m [Window]
windows

newWindow :: MonadFree TmuxThunk m => SessionId -> Ident -> m Window
newWindow :: SessionId -> Ident -> m Window
newWindow SessionId
sid Ident
name =
  Text -> [Text] -> m Window
forall a (m :: * -> *).
(TmuxCodec a, MonadFree TmuxThunk m) =>
Text -> [Text] -> m a
Tmux.unsafeReadOne Text
"new-window" [Item [Text]
"-t", SessionId -> Text
forall a. TmuxId a => a -> Text
formatId SessionId
sid, Item [Text]
"-n", Ident -> Text
identText Ident
name, Item [Text]
"-P"]

splitWindowAs ::
  (MonadFree TmuxThunk m, TmuxCodec a) =>
  FilePath ->
  WindowId ->
  m a
splitWindowAs :: FilePath -> WindowId -> m a
splitWindowAs FilePath
dir WindowId
windowId =
  Text -> [Text] -> m a
forall a (m :: * -> *).
(TmuxCodec a, MonadFree TmuxThunk m) =>
Text -> [Text] -> m a
Tmux.unsafeReadFirst Text
"split-window" [Item [Text]
"-t", WindowId -> Text
forall a. TmuxId a => a -> Text
formatId WindowId
windowId, Item [Text]
"-d", Item [Text]
"-P", Item [Text]
"-c", FilePath -> Text
forall a. ToText a => a -> Text
toText FilePath
dir]

splitWindow ::
  (MonadFree TmuxThunk m) =>
  FilePath ->
  WindowId ->
  m Pane
splitWindow :: FilePath -> WindowId -> m Pane
splitWindow =
  FilePath -> WindowId -> m Pane
forall (m :: * -> *) a.
(MonadFree TmuxThunk m, TmuxCodec a) =>
FilePath -> WindowId -> m a
splitWindowAs