{-# LANGUAGE MultiWayIf #-} module Codec.Compression.Zlib( decompress ) where import Codec.Compression.Zlib.Deflate import Codec.Compression.Zlib.Monad import Data.Bits import Data.ByteString.Lazy(ByteString) import qualified Data.ByteString.Lazy as BS decompress :: ByteString -> Maybe ByteString decompress ifile = case BS.uncons ifile of Nothing -> error "Could not read CMF." Just (cmf, rest) -> case BS.uncons rest of Nothing -> error "Could not read FLG." Just (_, rest') -> let cm = cmf .&. 0x0F cinfo = cmf `shiftR` 4 in if| cm /= 8 -> error "Non-DEFLATE compression method." | cinfo > 7 -> error "Window size too big." | otherwise -> runDeflateM inflate rest'