packages feed

chiasma-0.10.1.0: lib/Chiasma/Session.hs

module Chiasma.Session where

import Exon (exon)

import qualified Chiasma.Codec.Data.Session as Codec (Session (Session))
import qualified Chiasma.Codec.Data.Window as Codec (Window (Window))
import Chiasma.Command.Session (existingSessionId, newSession)
import Chiasma.Command.Window (newSessionWindow)
import Chiasma.Data.Ident (Ident)
import Chiasma.Data.LayoutError (LayoutError)
import Chiasma.Data.TmuxId (SessionId, WindowId)
import qualified Chiasma.Data.View as Tmux
import Chiasma.Data.Views (Views)
import Chiasma.Effect.TmuxApi (Tmux)
import Chiasma.View (findOrCreateView, viewsLogS)
import qualified Chiasma.View as Views (insertSession, session, updateSession, updateWindow)

findOrCreateSession ::
  Member (AtomicState Views) r =>
  Ident ->
  Sem r (Tmux.View SessionId)
findOrCreateSession =
  findOrCreateView Views.session Views.insertSession

spawnSession ::
  Members [AtomicState Views, Tmux, Stop LayoutError] r =>
  Tmux.View SessionId ->
  Tmux.View WindowId ->
  Sem r (SessionId, WindowId)
spawnSession session' window = do
  Codec.Session sid _ <- newSession session'.ident
  atomicModify' (Views.updateSession (Tmux.setViewId sid session'))
  Codec.Window wid _ _ <- newSessionWindow sid
  atomicModify' (Views.updateWindow (Tmux.setViewId wid window))
  viewsLogS [exon|spawned session #{show session'} with id #{show sid} and window id #{show wid}|]
  pure (sid, wid)

ensureSession ::
  Members [AtomicState Views, Tmux, Stop LayoutError] r =>
  Tmux.View SessionId ->
  Tmux.View WindowId ->
  Sem r (SessionId, Maybe WindowId)
ensureSession session' window = do
  existing <- join <$> traverse existingSessionId session'.id
  case existing of
    Just sid -> pure (sid, Nothing)
    Nothing -> second Just <$> spawnSession session' window