chiasma-0.2.0.0: lib/Chiasma/Session.hs
{-# LANGUAGE FlexibleContexts #-}
module Chiasma.Session where
import Control.Monad.Free.Class (MonadFree)
import qualified Chiasma.Codec.Data as Codec (Session(Session), Window(Window))
import Chiasma.Command.Session (existingSessionId, newSession)
import Chiasma.Command.Window (newSessionWindow)
import Chiasma.Data.Ident (Ident)
import Chiasma.Data.TmuxId (SessionId, WindowId)
import Chiasma.Data.TmuxThunk (TmuxThunk)
import qualified Chiasma.Data.View as Tmux (View(viewId, viewIdent), setViewId)
import Chiasma.Data.Views (Views)
import Chiasma.View (findOrCreateView, viewsLogS)
import qualified Chiasma.View as Views (insertSession, session, updateSession, updateWindow)
findOrCreateSession ::
MonadDeepState s Views m =>
Ident ->
m (Tmux.View SessionId)
findOrCreateSession =
findOrCreateView Views.session Views.insertSession
spawnSession ::
MonadDeepState s Views m =>
MonadFree TmuxThunk m =>
Tmux.View SessionId ->
Tmux.View WindowId ->
m (SessionId, WindowId)
spawnSession session' window = do
Codec.Session sid <- newSession (Tmux.viewIdent session')
modify $ Views.updateSession $ Tmux.setViewId sid session'
Codec.Window wid _ _ <- newSessionWindow sid
modify $ Views.updateWindow $ Tmux.setViewId wid window
viewsLogS $ "spawned session " <> show session' <> " with id " <> show sid <> " and window id " <> show wid
return (sid, wid)
ensureSession ::
MonadDeepState s Views m =>
MonadFree TmuxThunk m =>
Tmux.View SessionId ->
Tmux.View WindowId ->
m (SessionId, Maybe WindowId)
ensureSession session' window = do
existing <- join <$> traverse existingSessionId (Tmux.viewId session')
case existing of
Just sid -> return (sid, Nothing)
Nothing -> second Just <$> spawnSession session' window