{-# 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