packages feed

enumerator-0.1.1: Examples/enumerator-wcl.hs

module Main (main) where
import Data.Enumerator
import Data.Enumerator.IO
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B8
import System.IO
import System.Environment

iterLines :: Monad m => Iteratee e B.ByteString m Integer
iterLines = continue (step 0) where
	step acc EOF = yield acc EOF
	step acc (Chunks xs) = continue $ step $! foldl foldStep acc xs
	foldStep acc bytes = acc + countChar '\n' bytes

countChar :: Char -> B.ByteString -> Integer
countChar c = B8.foldl (\acc c' -> if c' == c then acc + 1 else acc) 0

main :: IO ()
main = do
	filename:_ <- getArgs
	h <- openBinaryFile filename ReadMode
	run (iterLines >>== enumHandle 4096 h) >>= print