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