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"]