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 = [Cmd] -> TmuxState
TmuxState [Cmd]
forall a. Default a => a
def

interpret ::
  (TmuxApi m api, MonadDeepError e TmuxError m) =>
  TmuxState ->
  api ->
  TmuxProg a ->
  m a
interpret :: TmuxState -> api -> TmuxProg a -> m a
interpret (TmuxState [Cmd]
cmds) api
api (Pure a
a) = a
a a -> m [()] -> m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ api -> (Text -> Either TmuxDecodeError ()) -> Cmds -> m [()]
forall (m :: * -> *) a b.
TmuxApi m a =>
a -> (Text -> Either TmuxDecodeError b) -> Cmds -> m [b]
runCommands api
api (Either TmuxDecodeError () -> Text -> Either TmuxDecodeError ()
forall a b. a -> b -> a
const (Either TmuxDecodeError () -> Text -> Either TmuxDecodeError ())
-> Either TmuxDecodeError () -> Text -> Either TmuxDecodeError ()
forall a b. (a -> b) -> a -> b
$ () -> Either TmuxDecodeError ()
forall a b. b -> Either a b
Right ()) ([Cmd] -> Cmds
Cmds [Cmd]
cmds)
interpret (TmuxState [Cmd]
cmds) api
api (Free (Read Cmd
cmd Text -> Either TmuxDecodeError a
decode [a] -> TmuxProg a
next)) = do
  [a]
a <- api -> (Text -> Either TmuxDecodeError a) -> Cmds -> m [a]
forall (m :: * -> *) a b.
TmuxApi m a =>
a -> (Text -> Either TmuxDecodeError b) -> Cmds -> m [b]
runCommands api
api Text -> Either TmuxDecodeError a
decode (Cmds -> m [a]) -> Cmds -> m [a]
forall a b. (a -> b) -> a -> b
$ [Cmd] -> Cmds
Cmds (Cmd
cmd Cmd -> [Cmd] -> [Cmd]
forall a. a -> [a] -> [a]
: [Cmd]
cmds)
  TmuxState -> api -> TmuxProg a -> m a
forall (m :: * -> *) api e a.
(TmuxApi m api, MonadDeepError e TmuxError m) =>
TmuxState -> api -> TmuxProg a -> m a
interpret TmuxState
forall a. Default a => a
def api
api ([a] -> TmuxProg a
next [a]
a)
interpret (TmuxState [Cmd]
cmds) api
api (Free (Write Cmd
cmd () -> TmuxProg a
next)) =
  TmuxState -> api -> TmuxProg a -> m a
forall (m :: * -> *) api e a.
(TmuxApi m api, MonadDeepError e TmuxError m) =>
TmuxState -> api -> TmuxProg a -> m a
interpret ([Cmd] -> TmuxState
TmuxState (Cmd
cmd Cmd -> [Cmd] -> [Cmd]
forall a. a -> [a] -> [a]
: [Cmd]
cmds)) api
api (() -> TmuxProg a
next ())
interpret (TmuxState [Cmd]
cmds) api
api (Free (Flush () -> TmuxProg a
next)) = do
  [()]
_ <- api -> (Text -> Either TmuxDecodeError ()) -> Cmds -> m [()]
forall (m :: * -> *) a b.
TmuxApi m a =>
a -> (Text -> Either TmuxDecodeError b) -> Cmds -> m [b]
runCommands api
api (Either TmuxDecodeError () -> Text -> Either TmuxDecodeError ()
forall a b. a -> b -> a
const (Either TmuxDecodeError () -> Text -> Either TmuxDecodeError ())
-> Either TmuxDecodeError () -> Text -> Either TmuxDecodeError ()
forall a b. (a -> b) -> a -> b
$ () -> Either TmuxDecodeError ()
forall a b. b -> Either a b
Right ()) ([Cmd] -> Cmds
Cmds [Cmd]
cmds)
  TmuxState -> api -> TmuxProg a -> m a
forall (m :: * -> *) api e a.
(TmuxApi m api, MonadDeepError e TmuxError m) =>
TmuxState -> api -> TmuxProg a -> m a
interpret TmuxState
forall a. Default a => a
def api
api (() -> TmuxProg a
next ())
interpret TmuxState
_ api
_ (Free (Failed TmuxError
err)) =
  TmuxError -> m a
forall e e' (m :: * -> *) a. MonadDeepError e e' m => e' -> m a
throwHoist TmuxError
err

runTmux ::
  (TmuxApi m api, MonadDeepError e TmuxError m) =>
  api ->
  TmuxProg a ->
  m a
runTmux :: api -> TmuxProg a -> m a
runTmux = TmuxState -> api -> TmuxProg a -> m a
forall (m :: * -> *) api e a.
(TmuxApi m api, MonadDeepError e TmuxError m) =>
TmuxState -> api -> TmuxProg a -> m a
interpret TmuxState
forall a. Default a => a
def