corecursive-main-0.1.0.0: src/System/Process/Corecursive.hs
-- | A module to facilitate and demonstrate a programming pattern where
-- application instances for a system is (co-)recursive.
module System.Process.Corecursive
( runCorecursiveApp
, callback
, readCallback
-- * re-exported for convenience
, App
, Self
, app
) where
import Control.Monad (void)
import Control.Monad.IO.Class (liftIO, MonadIO)
import System.Environment (getArgs, getExecutablePath)
import System.Process (callProcess, readProcess)
import System.Process.Corecursive.Base (runApp, app, App, Self(..))
-- | Run function for an App which arguments are read from the command line
-- using 'getArgs' and for which the binary is discovered from
-- 'getExecutablePath'.
runCorecursiveApp :: MonadIO m => App m [String] arg FilePath () -> m ()
runCorecursiveApp =
runApp (liftIO getExecutablePath) (liftIO getArgs)
-- | Callback running the Self executable locally and waiting until completion
-- using 'callProcess'.
callback :: MonadIO m => Self m [String] arg FilePath -> arg -> m ()
callback self a = do
exe <- executable self
args <- unparse self $ a
liftIO $ callProcess exe args
-- | Callback running the Self executable locally and waiting until completion
-- using 'readProcess'.
readCallback :: MonadIO m => Self m [String] arg FilePath -> arg -> m String
readCallback self a = do
exe <- executable self
args <- unparse self $ a
liftIO $ readProcess exe args ""