module Chiasma.Command.Session where

import Control.Monad.Free.Class (MonadFree)

import Chiasma.Codec.Data (Session(Session))
import Chiasma.Data.Ident (Ident, identText)
import Chiasma.Data.TmuxId (SessionId)
import Chiasma.Data.TmuxThunk (TmuxThunk)
import qualified Chiasma.Monad.Tmux as Tmux (read, unsafeReadOne, write)

sameId :: SessionId -> Session -> Bool
sameId :: SessionId -> Session -> Bool
sameId SessionId
target (Session SessionId
i) = SessionId
target SessionId -> SessionId -> Bool
forall a. Eq a => a -> a -> Bool
== SessionId
i

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

doesSessionExist :: MonadFree TmuxThunk m => SessionId -> m Bool
doesSessionExist :: SessionId -> m Bool
doesSessionExist SessionId
sessionId =
  (Session -> Bool) -> [Session] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (SessionId -> Session -> Bool
sameId SessionId
sessionId) ([Session] -> Bool) -> m [Session] -> m Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m [Session]
forall (m :: * -> *). MonadFree TmuxThunk m => m [Session]
sessions

existingSessionId :: MonadFree TmuxThunk m => SessionId -> m (Maybe SessionId)
existingSessionId :: SessionId -> m (Maybe SessionId)
existingSessionId SessionId
sessionId = do
  Bool
exists <- SessionId -> m Bool
forall (m :: * -> *). MonadFree TmuxThunk m => SessionId -> m Bool
doesSessionExist SessionId
sessionId
  return $ if Bool
exists then SessionId -> Maybe SessionId
forall a. a -> Maybe a
Just SessionId
sessionId else Maybe SessionId
forall a. Maybe a
Nothing

newSession :: MonadFree TmuxThunk m => Ident -> m Session
newSession :: Ident -> m Session
newSession Ident
name =
  Text -> [Text] -> m Session
forall a (m :: * -> *).
(TmuxCodec a, MonadFree TmuxThunk m) =>
Text -> [Text] -> m a
Tmux.unsafeReadOne Text
"new-session" [Item [Text]
"-s", Ident -> Text
identText Ident
name, Item [Text]
"-P"]

activateSession :: MonadFree TmuxThunk m => Int -> m ()
activateSession :: Int -> m ()
activateSession Int
sessionId =
  Text -> [Text] -> m ()
forall (m :: * -> *).
MonadFree TmuxThunk m =>
Text -> [Text] -> m ()
Tmux.write Text
"send-keys" [Item [Text]
"-t", Item [Text]
"%1", Text
"'tmux switch-client -t \\$" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Int -> Text
forall b a. (Show a, IsString b) => a -> b
show Int
sessionId Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"'", Item [Text]
"enter"]