packages feed

chiasma-0.2.0.0: lib/Chiasma/Monad/IndividualProcess.hs

module Chiasma.Monad.IndividualProcess where

import Control.Monad.Free (Free(..))

import Chiasma.Api.Class (TmuxApi(..))
import Chiasma.Data.Cmd (Cmd(..), Cmds(..))
import Chiasma.Data.TmuxError (TmuxError)
import Chiasma.Data.TmuxThunk (TmuxThunk(..))

type TmuxProg = Free TmuxThunk

newtype TmuxState = TmuxState [Cmd]

instance Default TmuxState where
  def = TmuxState def

interpret ::
  (TmuxApi m api, MonadDeepError e TmuxError m) =>
  TmuxState ->
  api ->
  TmuxProg a ->
  m a
interpret (TmuxState cmds) api (Pure a) = a <$ runCommands api (const $ Right ()) (Cmds cmds)
interpret (TmuxState cmds) api (Free (Read cmd decode next)) = do
  a <- runCommands api decode $ Cmds (cmd : cmds)
  interpret def api (next a)
interpret (TmuxState cmds) api (Free (Write cmd next)) =
  interpret (TmuxState (cmd : cmds)) api (next ())
interpret (TmuxState cmds) api (Free (Flush next)) = do
  _ <- runCommands api (const $ Right ()) (Cmds cmds)
  interpret def api (next ())
interpret _ _ (Free (Failed err)) =
  throwHoist err

runTmux ::
  (TmuxApi m api, MonadDeepError e TmuxError m) =>
  api ->
  TmuxProg a ->
  m a
runTmux = interpret def