packages feed

pure-zlib-0.6.6: Benchmark.hs

import Codec.Compression.Zlib(ZlibDecoder(..), decompressIncremental)
import Control.Monad(unless)
import qualified Data.ByteString      as S
import qualified Data.ByteString.Lazy as L
import Data.Time.Clock(getCurrentTime, diffUTCTime)
import Prelude hiding (readFile, writeFile)

main :: IO ()
main =
  do zbstr    <- L.readFile "test/test-cases/tor-list.z"
     goldbstr <- L.readFile "test/test-cases/tor-list.gold"
     before   <- getCurrentTime
     runDecompression (L.toChunks zbstr) goldbstr decompressIncremental
     after    <- getCurrentTime
     putStrLn ("Decompression took " ++ show (diffUTCTime after before))

runDecompression :: [S.ByteString] -> L.ByteString -> ZlibDecoder -> IO ()
runDecompression ls real decoder =
  case decoder of
    Done ->
      do unless (null ls) $
           fail "ERROR: Finished decompression with data left."
         unless (L.null real) $
           fail "ERROR: Did not completely decompress file."
         return ()
    DecompError e ->
      fail ("ERROR: " ++ show e)
    NeedMore f | (x:rest) <- ls -> runDecompression rest real (f x)
               | otherwise      ->
      fail "ERROR: Ran out of data mid-decompression."
    Chunk c m ->
      let (realfirst, realrest) = L.splitAt (L.length c) real
      in if realfirst == c
           then runDecompression ls realrest m
           else fail "Mismatch in decompression"