-- 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: -- --
-- >>> :{
-- 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:
--
--
-- >>> :{
-- 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