{-# LANGUAGE BangPatterns #-}
module Count where
import Progress
import qualified Data.ByteString.Lazy.Char8 as BL
-- | Get the maximum page number in the file,
-- and count the total number of lines.
countPages :: FilePath -> IO (Int, Int)
countPages !filePath
= do putStrLn $ "* Counting pages in file."
bs <- BL.readFile filePath
(lineCount, maxPageId) <- eat 0 0 (BL.lines bs)
printPosition True " lines read : " 10000 lineCount
putStrLn $ " max page id: " ++ padR 10 (show maxPageId)
return (lineCount, maxPageId)
where eat !lineCount !maxPageId []
= return (lineCount, maxPageId)
eat !lineCount !maxPageId (l:ls)
= case BL.readInt l of
Nothing
-> error $ "countPages: parse error on line " ++ show lineCount
Just (pid', _)
-> do let !maxPageId' = max pid' maxPageId
printPosition False " lines read : " 10000 lineCount
eat (lineCount + 1) maxPageId' ls