|Entire File Handle Utilities|
|Opened Handle Data Copying|
|hCopy :: (HVIO a, HVIO b) => a -> b -> IO ()|
|Copies from one handle to another in raw mode (using hGetContents).|
|hLineCopy :: (HVIO a, HVIO b) => a -> b -> IO ()|
Copies from one handle to another in text mode (with lines). Like hBlockCopy, this implementation is nice:
hLineCopy hin hout = hLineInteract hin hout id
|lineCopy :: IO ()|
|Copies from stdin to stdout using lines. An alias for hLineCopy over stdin and stdout.|
|Disk File Data Copying|
|copyFileLinesToFile :: FilePath -> FilePath -> IO ()|
Copies one filename to another in text mode.
Please note that the Unix permission bits are set at a default; you may need to adjust them after the copy yourself.
This function is implemented using hLineCopy internally.
|Line Processing Utilities|
|hPutStrLns :: HVIO a => a -> [String] -> IO ()|
|Given a list of strings, output a line containing each item, adding newlines as appropriate. The list is not expected to have newlines already.|
|hGetLines :: HVIO a => a -> IO [String]|
Given a handle, returns a list of all the lines in that handle. Thanks to lazy evaluation, this list does not have to be read all at once.
main = do l <- hGetLines stdin hPutStrLns stdout $ filter (startswith "1") l
|hInteract :: (HVIO a, HVIO b) => a -> b -> (String -> String) -> IO ()|
This is similar to the built-in interact, but works on any handle, not just stdin and stdout.
In other words:
interact = hInteract stdin stdout
|hLineInteract :: (HVIO a, HVIO b) => a -> b -> ([String] -> [String]) -> IO ()|
One could view this function like this:
hLineInteract finput foutput func = let newf = unlines . func . lines in hInteract finput foutput newf
Though the actual implementation is this for efficiency:
hLineInteract finput foutput func = do lines <- hGetLines finput hPutStrLns foutput (func lines)
|lineInteract :: ([String] -> [String]) -> IO ()|
lineInteract = hLineInteract stdin stdout
Here's an example:
main = lineInteract (filter (startswith "1"))
This will act as a simple version of grep -- all lines that start with 1 will be displayed; all others will be ignored.
|lazyMapM :: (a -> IO b) -> [a] -> IO [b]|
|Applies a given function to every item in a list, and returns the new list. Unlike the system's mapM, items are evaluated lazily.|
|optimizeForBatch :: IO ()|
|Sets stdin and stdout to be block-buffered. This can save a huge amount of system resources since far fewer syscalls are made, and can make programs run much faster.|
|optimizeForInteraction :: IO ()|
|Sets stdin and stdout to be line-buffered. This saves resources on stdout, but not many on stdin, since it it still looking for newlines.|
|Produced by Haddock version 0.8|