packages feed

chiasma-0.12.2.0: lib/Chiasma/Command/Session.hs

module Chiasma.Command.Session where

import Chiasma.Codec.Data.Client (Client (Client))
import Chiasma.Codec.Data.Session (Session (Session))
import Chiasma.Data.Ident (Ident)
import Chiasma.Data.SessionParams (SessionParams (..))
import qualified Chiasma.Data.Target as Target
import Chiasma.Data.TmuxCommand (TmuxCommand (ListClients, ListSessions, NewSession, SwitchClient))
import Chiasma.Data.TmuxError (TmuxError (NoClients))
import Chiasma.Data.TmuxId (SessionId)
import qualified Chiasma.Effect.TmuxApi as Tmux
import Chiasma.Effect.TmuxApi (Tmux)

sameId :: SessionId -> Session -> Bool
sameId target (Session i _) = target == i

sessions ::
  Member Tmux r =>
  Sem r [Session]
sessions =
  Tmux.send ListSessions

doesSessionExist ::
  Member Tmux r =>
  SessionId ->
  Sem r Bool
doesSessionExist sessionId =
  any (sameId sessionId) <$> sessions

existingSessionId ::
  Member Tmux r =>
  SessionId ->
  Sem r (Maybe SessionId)
existingSessionId sessionId = do
  exists <- doesSessionExist sessionId
  pure $ if exists then Just sessionId else Nothing

newSession ::
  Member Tmux r =>
  Ident ->
  Sem r Session
newSession name =
  Tmux.send (NewSession def { name = Just name })

clientForSession :: SessionId -> [Client] -> Maybe Client
clientForSession session =
  find \case
    Client _ False sid ->
      sid == session
    _ ->
      False

switchClient ::
  Members [Tmux, Stop TmuxError] r =>
  SessionId ->
  SessionId ->
  Sem r ()
switchClient clientSession session = do
  clients <- Tmux.send ListClients
  Client client _ _ <- stopNote NoClients (clientForSession clientSession clients)
  Tmux.send (SwitchClient client (Target.Session session))