Pipe-2.1.2: Process piping library

MaintainerMatti Niemenmaa <matti.niemenmaa+pipe@iki.fi>



Operations for piping data through multiple processes.

pipe is the most general function, with pipe' and pipeString provided for convenience purposes.

handlePipe, filePipe, and filePipe' are for the common file-to-file case and behave somewhat differently.

Whenever specifying a path to a process, explicitly specifying the current directory is recommended for portability. That is: use "./foo" instead of "foo", for instance.

On Windows, appending ".exe" to process paths is attempted if the invocation fails.



pipe :: (Handle -> a -> IO ()) -> (Handle -> IO b) -> FilePath -> [(FilePath, [String])] -> a -> IO bSource

Pipes the input, using the given writer and reader functions, through all the commands named, in the given working directory. Returns the result.

An exception is thrown if the list of programs is empty.

The writer function is called in a forkIO'd thread, allowing this to be lazy. That thread also calls waitForProcess when done writing so that the processes get terminated cleanly; this means that the runtime should be multithreaded, or the call will block all threads and this function may deadlock. (In GHC, compile with -threaded.)

SIGPIPE is ignored in the writer thread. Likewise, any IOExceptions are caught and ignored.

pipe' :: (Handle -> a -> IO ()) -> (Handle -> IO b) -> [(FilePath, [String])] -> a -> IO bSource

A convenience function for when you don't care about the working directory, pipe' uses ".".

pipeString :: [(FilePath, [String])] -> String -> IO StringSource

A convenience function for the common case of piping from a String to a String.

handlePipe :: FilePath -> [(FilePath, [String])] -> Handle -> Handle -> IO ()Source

A function for the common case of piping from a Handle to a Handle.

Note that this is not merely a convenient frontend for pipe and is fundamentally different in the following ways:

  • A null list of programs is allowed, in which case the contents of the input Handle are simply written to the output Handle.
  • This function is not lazy and returns only when the writing has been completed.

filePipe :: FilePath -> [(FilePath, [String])] -> FilePath -> FilePath -> IO ()Source

A convenience function for handlePipe. Opens the given files in binary mode.

filePipe' :: [(FilePath, [String])] -> FilePath -> FilePath -> IO ()Source

Like filePipe, but the working directory used is the directory component of the path to the first file.