-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Use OS processes as stream transformation functions -- -- Use operating system (OS) commands in Haskell programs as if they were -- native Haskell functions, by treating their inputs and outputs as -- Haskell streams. This allows you to write high-level Haskell scripts -- that can perform tasks similar to shell scripts, but with C-like -- performance, and with strong safety guarantees, refactorability, and -- modularity. @package streamly-process @version 0.3.0 module Streamly.Internal.System.Process -- | Process configuration used for creating a new process. -- -- By default the process config is setup to inherit the following -- attributes from the parent process: -- -- -- -- On POSIX: -- -- -- -- On Windows by default the parent process waits for the entire child -- process tree to finish. data Config -- | Set the current working directory of the new process. When -- Nothing, the working directory is inherited from the parent -- process. -- -- Default is Nothing - inherited from the parent process. setCwd :: Maybe FilePath -> Config -> Config -- | Set the environment variables for the new process. When -- Nothing, the environment is inherited from the parent process. -- -- Default is Nothing - inherited from the parent process. setEnv :: Maybe [(String, String)] -> Config -> Config -- | Close all open file descriptors inherited from the parent process. -- Note, this does not apply to stdio descriptors - the behavior of those -- is determined by other configuration settings. -- -- Default is False. -- -- Note: if the number of open descriptors is large, it may take a while -- closing them. closeFiles :: Bool -> Config -> Config -- | If True the new process starts a new process group, becomes a -- process group leader, its pid becoming the process group id. -- -- See the POSIX setpgid man page. -- -- Default is False, the new process belongs to the parent's -- process group. newProcessGroup :: Bool -> Config -> Config -- | Define the terminal session behavior for the new process. -- -- Default is InheritSession. setSession :: Session -> Config -> Config -- | When this is True, the parent process ignores user interrupt -- signals SIGINT and SIGQUIT delivered to it until the -- child process exits. If multiple child processes are started then the -- default handling in the parent is restored only after the last one -- exits. -- -- When a user presses CTRL-C or CTRL- on the terminal, a SIGINT or -- SIGQUIT is sent to all the foreground processes in the terminal -- session, this includes both the child and the parent. By default, on -- receiving these signals, the parent process would cleanup and exit, to -- avoid that and let the child handle these signals we can choose to -- ignore these signals in the parent until the child exits. -- -- POSIX only. Default is False. parentIgnoresInterrupt :: Bool -> Config -> Config -- | Use the POSIX setuid call to set the user id of the new -- process before executing the command. The parent process must have -- sufficient privileges to set the user id. -- -- POSIX only. See the POSIX setuid man page. -- -- Default is Nothing - inherit from the parent. setUserId :: Maybe Word32 -> Config -> Config -- | Use the POSIX setgid call to set the group id of the new -- process before executing the command. The parent process must have -- sufficient privileges to set the group id. -- -- POSIX only. See the POSIX setgid man page. -- -- Default is Nothing - inherit from the parent. setGroupId :: Maybe Word32 -> Config -> Config -- | On Windows, the parent waits for the entire tree of process i.e. -- including processes that are spawned by the child process. -- -- Default is True. waitForChildTree :: Bool -> Config -> Config inheritStdin :: Config -> Config inheritStdout :: Config -> Config pipeStdErr :: Config -> Config -- | An exception that is raised when a process fails. newtype ProcessFailure -- | The exit code of the process. ProcessFailure :: Int -> ProcessFailure -- | The following code is equivalent to the shell command echo "hello -- world": -- --
--   >>> :{
--      Process.toBytes "echo" ["hello world"]
--    & Stream.fold Stdio.write
--    :}
--   hello world
--   
toBytes :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m Word8 -- | The following code is equivalent to the shell command echo "hello -- world": -- --
--   >>> :{
--      Process.toChunks "echo" ["hello world"]
--    & Stream.fold Stdio.writeChunks
--    :}
--   hello world
--   
-- --
--   >>> toChunks = toChunksWith id
--   
toChunks :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m (Array Word8) toChunksWith :: (MonadCatch m, MonadAsync m) => (Config -> Config) -> FilePath -> [String] -> Stream m (Array Word8) -- |
--   >>> toChars path args = toBytes path args & Unicode.decodeUtf8
--   
toChars :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m Char -- |
--   >>> toLines path args f = toChars path args & Unicode.lines f
--   
toLines :: (MonadAsync m, MonadCatch m) => Fold m Char a -> FilePath -> [String] -> Stream m a -- |
--   >>> toString path args = toChars path args & Stream.fold Fold.toList
--   
toString :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> m String -- |
--   >>> toStdout path args = toChunks path args & Stdio.putChunks
--   
toStdout :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> m () -- |
--   >>> toNull path args = toChunks path args & Stream.fold Fold.drain
--   
toNull :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> m () -- | Like pipeChunks except that it works on a stream of bytes -- instead of a stream of chunks. -- -- We can write the example in pipeChunks as follows. -- --
--   >>> :{
--      Process.toBytes "echo" ["hello world"]
--    & Process.pipeBytes "tr" ["[a-z]", "[A-Z]"]
--    & Stream.fold Stdio.write
--    :}
--   HELLO WORLD
--   
-- -- pre-release pipeBytes :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m Word8 -> Stream m Word8 -- | pipeChunks file args input runs the executable file -- specified by its name or path using args as arguments and -- input stream as its standard input. Returns the standard -- output of the executable as a stream. -- -- If only the name of an executable file is specified instead of its -- path then the file name is searched in the directories specified by -- the PATH environment variable. -- -- If the input stream throws an exception or if the output stream is -- garbage collected before it could finish then the process is -- terminated with SIGTERM. -- -- If the process terminates with a non-zero exit code then a -- ProcessFailure exception is raised. -- -- The following code is equivalent to the shell command echo "hello -- world" | tr [a-z] [A-Z]: -- --
--   >>> :{
--      Process.toChunks "echo" ["hello world"]
--    & Process.pipeChunks "tr" ["[a-z]", "[A-Z]"]
--    & Stream.fold Stdio.writeChunks
--    :}
--   HELLO WORLD
--   
-- -- pre-release pipeChunks :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Array Word8) pipeChunksWith :: (MonadCatch m, MonadAsync m) => (Config -> Config) -> FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Array Word8) -- | Like pipeChunks except that it works on a stream of chars -- instead of a stream of chunks. -- --
--   >>> :{
--      Process.toChars "echo" ["hello world"]
--    & Process.pipeChars "tr" ["[a-z]", "[A-Z]"]
--    & Stdio.putChars
--    :}
--   HELLO WORLD
--   
-- -- We can seamlessly replace the tr process with the Haskell -- toUpper function: -- --
--   >>> :{
--      Process.toChars "echo" ["hello world"]
--    & fmap toUpper
--    & Stdio.putChars
--    :}
--   HELLO WORLD
--   
-- -- pre-release pipeChars :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m Char -> Stream m Char -- | toBytesEither path args runs the executable at path -- using args as arguments and returns a stream of Either -- bytes. The Left values are from stderr and the -- Right values are from stdout of the executable. -- -- Raises ProcessFailure exception in case of failure. -- -- The following example uses echo to write hello to -- stdout and world to stderr, then uses folds -- from Streamly.Console.Stdio to write them back to -- stdout and stderr respectively: -- --
--   >>> :{
--     Process.toBytesEither "/bin/bash" ["-c", "echo 'hello'; echo 'world' 1>&2"]
--   & Stream.fold (Fold.partition Stdio.writeErr Stdio.write)
--   :}
--   world
--   hello
--   ((),())
--   
toBytesEither :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m (Either Word8 Word8) -- | Like toBytes but generates a stream of Array Word8 -- instead of a stream of Word8. -- --
--   >>> :{
--     toChunksEither "bash" ["-c", "echo 'hello'; echo 'world' 1>&2"]
--   & Stream.fold (Fold.partition Stdio.writeErrChunks Stdio.writeChunks)
--   :}
--   world
--   hello
--   ((),())
--   
-- --
--   >>> toChunksEither = toChunksEitherWith id
--   
-- -- Prefer 'toChunksEither over 'toBytesEither when performance matters. -- -- Pre-release toChunksEither :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m (Either (Array Word8) (Array Word8)) toChunksEitherWith :: (MonadCatch m, MonadAsync m) => (Config -> Config) -> FilePath -> [String] -> Stream m (Either (Array Word8) (Array Word8)) -- | pipeBytesEither path args input runs the executable at -- path using args as arguments and input -- stream as its standard input. The error stream of the executable is -- presented as Left values in the resulting stream and output -- stream as Right values. -- -- Raises ProcessFailure exception in case of failure. -- -- For example, the following is equivalent to the shell command echo -- "hello world" | tr [:lower:] [:upper:]: -- --
--   >>> :{
--      pipeBytesEither "echo" ["hello world"] Stream.nil
--    & Stream.catRights
--    & pipeBytesEither "tr" ["[:lower:]", "[:upper:]"]
--    & Stream.catRights
--    & Stream.fold Stdio.write
--    :}
--   HELLO WORLD
--   
pipeBytesEither :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m Word8 -> Stream m (Either Word8 Word8) pipeChunksEither :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Either (Array Word8) (Array Word8)) pipeChunksEitherWith :: (MonadCatch m, MonadAsync m) => (Config -> Config) -> FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Either (Array Word8) (Array Word8)) standalone :: Bool -> (Bool, Bool, Bool) -> (Config -> Config) -> FilePath -> [String] -> IO (Either ExitCode ProcessHandle) -- | Inherits stdin, stdout, and stderr from the parent, so that the user -- can interact with the process, user interrupts are handled by the -- child process, the parent waits for the child process to exit. -- -- This is same as the common system function found in other -- libraries used to execute commands. -- -- On Windows you can pass setSession NewConsole to create a new -- console. interactive :: (Config -> Config) -> FilePath -> [String] -> IO ExitCode -- | Closes stdin, stdout and stderr, creates a new session, detached from -- the terminal, the parent does not wait for the process to finish. daemon :: (Config -> Config) -> FilePath -> [String] -> IO ProcessHandle -- | Deprecated: Please use pipeBytes instead. processBytes :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m Word8 -> Stream m Word8 -- | Deprecated: Please use pipeChunks instead. processChunks :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Array Word8) instance GHC.Show.Show Streamly.Internal.System.Process.ProcessFailure instance GHC.Exception.Type.Exception Streamly.Internal.System.Process.ProcessFailure module Streamly.Internal.System.Command -- |
--   >>> toBytes = streamWith Process.toBytes
--   
-- --
--   >>> toBytes "echo hello world" & Stdio.putBytes
--   hello world
--   
--   >>> toBytes "echo hello\\ world" & Stdio.putBytes
--   hello world
--   
--   >>> toBytes "echo 'hello world'" & Stdio.putBytes
--   hello world
--   
--   >>> toBytes "echo \"hello world\"" & Stdio.putBytes
--   hello world
--   
-- -- Pre-release toBytes :: (MonadAsync m, MonadCatch m) => String -> Stream m Word8 -- |
--   >>> toChunks = streamWith Process.toChunks
--   
-- --
--   >>> toChunks "echo hello world" & Stdio.putChunks
--   hello world
--   
-- -- Pre-release toChunks :: (MonadAsync m, MonadCatch m) => String -> Stream m (Array Word8) -- |
--   >>> toChars = streamWith Process.toChars
--   
-- --
--   >>> toChars "echo hello world" & Stdio.putChars
--   hello world
--   
-- -- Pre-release toChars :: (MonadAsync m, MonadCatch m) => String -> Stream m Char -- |
--   >>> toLines f = streamWith (Process.toLines f)
--   
-- --
--   >>> toLines Fold.toList "echo -e hello\\\\nworld" & Stream.fold Fold.toList
--   ["hello","world"]
--   
-- -- Pre-release toLines :: (MonadAsync m, MonadCatch m) => Fold m Char a -> String -> Stream m a -- |
--   >>> toString = runWith Process.toString
--   
-- --
--   >>> toString "echo hello world"
--   "hello world\n"
--   
-- -- Pre-release toString :: (MonadAsync m, MonadCatch m) => String -> m String -- |
--   >>> toStdout = runWith Process.toStdout
--   
-- --
--   >>> toStdout "echo hello world"
--   hello world
--   
-- -- Pre-release toStdout :: (MonadAsync m, MonadCatch m) => String -> m () -- |
--   >>> toNull = runWith Process.toNull
--   
-- --
--   >>> toNull "echo hello world"
--   
-- -- Pre-release toNull :: (MonadAsync m, MonadCatch m) => String -> m () -- | Like pipeChunks except that it works on a stream of bytes -- instead of a stream of chunks. -- --
--   >>> :{
--      toBytes "echo hello world"
--    & pipeBytes "tr [a-z] [A-Z]"
--    & Stdio.putBytes
--    :}
--   HELLO WORLD
--   
-- -- Pre-release pipeBytes :: (MonadAsync m, MonadCatch m) => String -> Stream m Word8 -> Stream m Word8 -- | Like pipeChunks except that it works on a stream of chars -- instead of a stream of chunks. -- --
--   >>> :{
--      toChars "echo hello world"
--    & pipeChars "tr [a-z] [A-Z]"
--    & Stdio.putChars
--    :}
--   HELLO WORLD
--   
-- -- Pre-release pipeChars :: (MonadAsync m, MonadCatch m) => String -> Stream m Char -> Stream m Char -- | pipeChunks command input runs the executable with arguments -- specified by command and supplying input stream as -- its standard input. Returns the standard output of the executable as a -- stream of byte arrays. -- -- If only the name of an executable file is specified instead of its -- path then the file name is searched in the directories specified by -- the PATH environment variable. -- -- If the input stream throws an exception or if the output stream is -- garbage collected before it could finish then the process is -- terminated with SIGTERM. -- -- If the process terminates with a non-zero exit code then a -- ProcessFailure exception is raised. -- -- The following code is equivalent to the shell command echo "hello -- world" | tr [a-z] [A-Z]: -- --
--   >>> :{
--      toChunks "echo hello world"
--    & pipeChunks "tr [a-z] [A-Z]"
--    & Stdio.putChunks
--    :}
--   HELLO WORLD
--   
-- -- Pre-release pipeChunks :: (MonadAsync m, MonadCatch m) => String -> Stream m (Array Word8) -> Stream m (Array Word8) -- | A modifier for process running APIs in Streamly.System.Process -- to run command strings. -- -- For example: -- --
--   >>> runWith Process.toString "echo hello"
--   "hello\n"
--   
--   >>> runWith Process.toStdout "echo hello"
--   hello
--   
-- -- Internal runWith :: MonadCatch m => (FilePath -> [String] -> m a) -> String -> m a -- | A modifier for stream generation APIs in -- Streamly.System.Process to generate streams from command -- strings. -- -- For example: -- --
--   >>> streamWith Process.toBytes "echo hello" & Stdio.putBytes
--   hello
--   
--   >>> streamWith Process.toChunks "echo hello" & Stdio.putChunks
--   hello
--   
-- -- Internal streamWith :: MonadCatch m => (FilePath -> [String] -> Stream m a) -> String -> Stream m a -- | A modifier for process piping APIs in Streamly.System.Process -- to pipe data through processes specified by command strings. -- -- For example: -- --
--   >>> :{
--      toChunks "echo hello"
--    & pipeWith Process.pipeChunks "tr [a-z] [A-Z]"
--    & Stdio.putChunks
--    :}
--   HELLO
--   
-- -- Internal pipeWith :: MonadCatch m => (FilePath -> [String] -> Stream m a -> Stream m b) -> String -> Stream m a -> Stream m b -- | Use command strings to execute OS processes. These processes can be -- used just like native Haskell functions - to generate, transform or -- consume streams. It provides a powerful way to write high-level -- Haskell scripts to perform tasks similar to shell scripts without -- requiring the shell. Moreover, the Haskell scripts provide C-like -- performance. -- -- This module is a wrapper over the Streamly.System.Process -- module. -- -- See also: Streamly.Internal.System.Command. module Streamly.System.Command -- | An exception that is raised when a process fails. newtype ProcessFailure -- | The exit code of the process. ProcessFailure :: Int -> ProcessFailure -- |
--   >>> toBytes = streamWith Process.toBytes
--   
-- --
--   >>> toBytes "echo hello world" & Stdio.putBytes
--   hello world
--   
--   >>> toBytes "echo hello\\ world" & Stdio.putBytes
--   hello world
--   
--   >>> toBytes "echo 'hello world'" & Stdio.putBytes
--   hello world
--   
--   >>> toBytes "echo \"hello world\"" & Stdio.putBytes
--   hello world
--   
-- -- Pre-release toBytes :: (MonadAsync m, MonadCatch m) => String -> Stream m Word8 -- |
--   >>> toChunks = streamWith Process.toChunks
--   
-- --
--   >>> toChunks "echo hello world" & Stdio.putChunks
--   hello world
--   
-- -- Pre-release toChunks :: (MonadAsync m, MonadCatch m) => String -> Stream m (Array Word8) -- |
--   >>> toChars = streamWith Process.toChars
--   
-- --
--   >>> toChars "echo hello world" & Stdio.putChars
--   hello world
--   
-- -- Pre-release toChars :: (MonadAsync m, MonadCatch m) => String -> Stream m Char -- |
--   >>> toLines f = streamWith (Process.toLines f)
--   
-- --
--   >>> toLines Fold.toList "echo -e hello\\\\nworld" & Stream.fold Fold.toList
--   ["hello","world"]
--   
-- -- Pre-release toLines :: (MonadAsync m, MonadCatch m) => Fold m Char a -> String -> Stream m a -- |
--   >>> toString = runWith Process.toString
--   
-- --
--   >>> toString "echo hello world"
--   "hello world\n"
--   
-- -- Pre-release toString :: (MonadAsync m, MonadCatch m) => String -> m String -- |
--   >>> toStdout = runWith Process.toStdout
--   
-- --
--   >>> toStdout "echo hello world"
--   hello world
--   
-- -- Pre-release toStdout :: (MonadAsync m, MonadCatch m) => String -> m () -- |
--   >>> toNull = runWith Process.toNull
--   
-- --
--   >>> toNull "echo hello world"
--   
-- -- Pre-release toNull :: (MonadAsync m, MonadCatch m) => String -> m () -- | Like pipeChunks except that it works on a stream of bytes -- instead of a stream of chunks. -- --
--   >>> :{
--      toBytes "echo hello world"
--    & pipeBytes "tr [a-z] [A-Z]"
--    & Stdio.putBytes
--    :}
--   HELLO WORLD
--   
-- -- Pre-release pipeBytes :: (MonadAsync m, MonadCatch m) => String -> Stream m Word8 -> Stream m Word8 -- | Like pipeChunks except that it works on a stream of chars -- instead of a stream of chunks. -- --
--   >>> :{
--      toChars "echo hello world"
--    & pipeChars "tr [a-z] [A-Z]"
--    & Stdio.putChars
--    :}
--   HELLO WORLD
--   
-- -- Pre-release pipeChars :: (MonadAsync m, MonadCatch m) => String -> Stream m Char -> Stream m Char -- | pipeChunks command input runs the executable with arguments -- specified by command and supplying input stream as -- its standard input. Returns the standard output of the executable as a -- stream of byte arrays. -- -- If only the name of an executable file is specified instead of its -- path then the file name is searched in the directories specified by -- the PATH environment variable. -- -- If the input stream throws an exception or if the output stream is -- garbage collected before it could finish then the process is -- terminated with SIGTERM. -- -- If the process terminates with a non-zero exit code then a -- ProcessFailure exception is raised. -- -- The following code is equivalent to the shell command echo "hello -- world" | tr [a-z] [A-Z]: -- --
--   >>> :{
--      toChunks "echo hello world"
--    & pipeChunks "tr [a-z] [A-Z]"
--    & Stdio.putChunks
--    :}
--   HELLO WORLD
--   
-- -- Pre-release pipeChunks :: (MonadAsync m, MonadCatch m) => String -> Stream m (Array Word8) -> Stream m (Array Word8) -- | Use OS processes just like native Haskell functions - to generate, -- transform or consume streams. -- -- See Streamly.System.Command module for a higher level wrapper -- over this module. -- -- See also: Streamly.Internal.System.Process for unreleased -- functions. module Streamly.System.Process -- | An exception that is raised when a process fails. newtype ProcessFailure -- | The exit code of the process. ProcessFailure :: Int -> ProcessFailure -- | Process configuration used for creating a new process. -- -- By default the process config is setup to inherit the following -- attributes from the parent process: -- -- -- -- On POSIX: -- -- -- -- On Windows by default the parent process waits for the entire child -- process tree to finish. data Config -- | The following code is equivalent to the shell command echo "hello -- world": -- --
--   >>> :{
--      Process.toChunks "echo" ["hello world"]
--    & Stream.fold Stdio.writeChunks
--    :}
--   hello world
--   
-- --
--   >>> toChunks = toChunksWith id
--   
toChunks :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m (Array Word8) -- | The following code is equivalent to the shell command echo "hello -- world": -- --
--   >>> :{
--      Process.toBytes "echo" ["hello world"]
--    & Stream.fold Stdio.write
--    :}
--   hello world
--   
toBytes :: (MonadAsync m, MonadCatch m) => FilePath -> [String] -> Stream m Word8 -- | pipeChunks file args input runs the executable file -- specified by its name or path using args as arguments and -- input stream as its standard input. Returns the standard -- output of the executable as a stream. -- -- If only the name of an executable file is specified instead of its -- path then the file name is searched in the directories specified by -- the PATH environment variable. -- -- If the input stream throws an exception or if the output stream is -- garbage collected before it could finish then the process is -- terminated with SIGTERM. -- -- If the process terminates with a non-zero exit code then a -- ProcessFailure exception is raised. -- -- The following code is equivalent to the shell command echo "hello -- world" | tr [a-z] [A-Z]: -- --
--   >>> :{
--      Process.toChunks "echo" ["hello world"]
--    & Process.pipeChunks "tr" ["[a-z]", "[A-Z]"]
--    & Stream.fold Stdio.writeChunks
--    :}
--   HELLO WORLD
--   
-- -- pre-release pipeChunks :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Array Word8) -- | Like pipeChunks except that it works on a stream of bytes -- instead of a stream of chunks. -- -- We can write the example in pipeChunks as follows. -- --
--   >>> :{
--      Process.toBytes "echo" ["hello world"]
--    & Process.pipeBytes "tr" ["[a-z]", "[A-Z]"]
--    & Stream.fold Stdio.write
--    :}
--   HELLO WORLD
--   
-- -- pre-release pipeBytes :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m Word8 -> Stream m Word8 -- | Deprecated: Please use pipeChunks instead. processChunks :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m (Array Word8) -> Stream m (Array Word8) -- | Deprecated: Please use pipeBytes instead. processBytes :: (MonadCatch m, MonadAsync m) => FilePath -> [String] -> Stream m Word8 -> Stream m Word8