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