enumerator-0.4.8: examples/cat.hs
-----------------------------------------------------------------------------
-- |
-- Copyright: 2010 John Millikin
-- License: MIT
--
-- Maintainer: jmillikin@gmail.com
-- Portability: portable
--
-----------------------------------------------------------------------------
module Main (main) where
import Data.Enumerator
import Data.Enumerator.Binary (enumFile, enumHandle, iterHandle)
import System.IO (stdin, stdout)
import System.Environment (getArgs)
main :: IO ()
main = do
-- Our example enumlates standard /bin/cat, where if the argument list
-- is empty, data is echoed from stdin.
args <- getArgs
let enum = if null args
then enumHandle 1 stdin
else concatEnums (Prelude.map enumFile args)
-- 'run' sends an EOF to an iteratee and returns its output, which
-- is either a 'Yield' or an 'Error'.
res <- run (enum $$ iterHandle stdout)
-- Finally, 'run' has returned either an error or the iteratee's
-- result. 'iterHandle' doesn't return a useful result, so as long
-- as it succeeded the actual value is ignored.
case res of
Left err -> putStrLn $ "ERROR: " ++ show err
Right _ -> return ()