| |||||||||||||||||||||||
| |||||||||||||||||||||||
| |||||||||||||||||||||||
Description | |||||||||||||||||||||||
This module provides various helpful utilities for dealing with I/O. There are more functions in MissingH.IO.Binary. Written by John Goerzen, jgoerzen@complete.org If you're not familiar with the MissingH.IO.HVIO.HVIO types, don't worry; you can just use a regular Handle anywhere you see them. | |||||||||||||||||||||||
Synopsis | |||||||||||||||||||||||
| |||||||||||||||||||||||
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). | |||||||||||||||||||||||
hCopyProgress | |||||||||||||||||||||||
| |||||||||||||||||||||||
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. Combined with hPutStrLns, this can make a powerful way to develop filters. See the lineInteract function for more on that concept. Example: main = do l <- hGetLines stdin hPutStrLns stdout $ filter (startswith "1") l | |||||||||||||||||||||||
Lazy Interaction | |||||||||||||||||||||||
Character-based | |||||||||||||||||||||||
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 | |||||||||||||||||||||||
Line-based | |||||||||||||||||||||||
hLineInteract :: (HVIO a, HVIO b) => a -> b -> ([String] -> [String]) -> IO () | |||||||||||||||||||||||
Line-based interaction over arbitrary handles. This is similar to wrapping hInteract with lines and unlines. 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 () | |||||||||||||||||||||||
Line-based interaction. This is similar to wrapping your interact functions with lines and unlines. This equality holds: 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. | |||||||||||||||||||||||
Optimizations | |||||||||||||||||||||||
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.6 |