module System.Process.Quick.CallSpec.Run where

import System.Process.Quick.Prelude
import System.Process.Quick.CallSpec.Type
import System.Process qualified as SP

-- | See 'System.Process.callProcess'
callProcess :: (MonadIO m, CallSpec cs) => cs -> m ()
callProcess :: forall (m :: * -> *) cs. (MonadIO m, CallSpec cs) => cs -> m ()
callProcess cs
cs = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ FilePath -> [FilePath] -> IO ()
SP.callProcess (Proxy cs -> FilePath
forall cs. CallSpec cs => Proxy cs -> FilePath
programName (Proxy cs -> FilePath) -> Proxy cs -> FilePath
forall a b. (a -> b) -> a -> b
$ cs -> Proxy cs
forall a. a -> Proxy a
forall (f :: * -> *) a. Applicative f => a -> f a
pure cs
cs) (cs -> [FilePath]
forall cs. CallSpec cs => cs -> [FilePath]
programArgs cs
cs)

-- | See 'System.Process.spawnProcess'
spawnProcess :: (MonadIO m, CallSpec cs) => cs -> m SP.ProcessHandle
spawnProcess :: forall (m :: * -> *) cs.
(MonadIO m, CallSpec cs) =>
cs -> m ProcessHandle
spawnProcess cs
cs = IO ProcessHandle -> m ProcessHandle
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ProcessHandle -> m ProcessHandle)
-> IO ProcessHandle -> m ProcessHandle
forall a b. (a -> b) -> a -> b
$ FilePath -> [FilePath] -> IO ProcessHandle
SP.spawnProcess (Proxy cs -> FilePath
forall cs. CallSpec cs => Proxy cs -> FilePath
programName (Proxy cs -> FilePath) -> Proxy cs -> FilePath
forall a b. (a -> b) -> a -> b
$ cs -> Proxy cs
forall a. a -> Proxy a
forall (f :: * -> *) a. Applicative f => a -> f a
pure cs
cs) (cs -> [FilePath]
forall cs. CallSpec cs => cs -> [FilePath]
programArgs cs
cs)

-- | See 'System.Process.readProcess'
readProcess :: (MonadIO m, CallSpec cs) => cs -> String -> m String
readProcess :: forall (m :: * -> *) cs.
(MonadIO m, CallSpec cs) =>
cs -> FilePath -> m FilePath
readProcess cs
cs FilePath
input = IO FilePath -> m FilePath
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO FilePath -> m FilePath) -> IO FilePath -> m FilePath
forall a b. (a -> b) -> a -> b
$ FilePath -> [FilePath] -> FilePath -> IO FilePath
SP.readProcess (Proxy cs -> FilePath
forall cs. CallSpec cs => Proxy cs -> FilePath
programName (Proxy cs -> FilePath) -> Proxy cs -> FilePath
forall a b. (a -> b) -> a -> b
$ cs -> Proxy cs
forall a. a -> Proxy a
forall (f :: * -> *) a. Applicative f => a -> f a
pure cs
cs) (cs -> [FilePath]
forall cs. CallSpec cs => cs -> [FilePath]
programArgs cs
cs) FilePath
input

-- | See 'System.Process.readProcessWithExitCode'
readProcessWithExitCode :: (MonadIO m, CallSpec cs) => cs -> String -> m (ExitCode, String, String)
readProcessWithExitCode :: forall (m :: * -> *) cs.
(MonadIO m, CallSpec cs) =>
cs -> FilePath -> m (ExitCode, FilePath, FilePath)
readProcessWithExitCode cs
cs FilePath
input = IO (ExitCode, FilePath, FilePath)
-> m (ExitCode, FilePath, FilePath)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (ExitCode, FilePath, FilePath)
 -> m (ExitCode, FilePath, FilePath))
-> IO (ExitCode, FilePath, FilePath)
-> m (ExitCode, FilePath, FilePath)
forall a b. (a -> b) -> a -> b
$ FilePath
-> [FilePath] -> FilePath -> IO (ExitCode, FilePath, FilePath)
SP.readProcessWithExitCode (Proxy cs -> FilePath
forall cs. CallSpec cs => Proxy cs -> FilePath
programName (Proxy cs -> FilePath) -> Proxy cs -> FilePath
forall a b. (a -> b) -> a -> b
$ cs -> Proxy cs
forall a. a -> Proxy a
forall (f :: * -> *) a. Applicative f => a -> f a
pure cs
cs) (cs -> [FilePath]
forall cs. CallSpec cs => cs -> [FilePath]
programArgs cs
cs) FilePath
input

-- | See 'System.Process.proc'
proc :: CallSpec cs => cs -> CreateProcess
proc :: forall cs. CallSpec cs => cs -> CreateProcess
proc cs
cs = FilePath -> [FilePath] -> CreateProcess
SP.proc (Proxy cs -> FilePath
forall cs. CallSpec cs => Proxy cs -> FilePath
programName (Proxy cs -> FilePath) -> Proxy cs -> FilePath
forall a b. (a -> b) -> a -> b
$ cs -> Proxy cs
forall a. a -> Proxy a
forall (f :: * -> *) a. Applicative f => a -> f a
pure cs
cs) (cs -> [FilePath]
forall cs. CallSpec cs => cs -> [FilePath]
programArgs cs
cs)