module Pipes.Zlib (
decompress
, compress
, ZC.defaultCompression
, ZC.noCompression
, ZC.bestSpeed
, ZC.bestCompression
, ZC.compressionLevel
, ZC.defaultWindowBits
, ZC.windowBits
) where
import qualified Codec.Compression.Zlib as ZC
import qualified Codec.Zlib as Z
import Control.Monad (unless)
import qualified Data.ByteString as B
import Pipes
decompress
:: MonadIO m
=> ZC.WindowBits
-> Producer' B.ByteString m r
-> Producer' B.ByteString m r
decompress wbits p0 = do
inf <- liftIO $ Z.initInflate wbits
r <- for p0 $ \bs -> do
popper <- liftIO (Z.feedInflate inf bs)
fromPopper popper
bs <- liftIO $ Z.finishInflate inf
unless (B.null bs) (yield bs)
return r
compress
:: MonadIO m
=> ZC.CompressionLevel
-> ZC.WindowBits
-> Producer' B.ByteString m r
-> Producer' B.ByteString m r
compress clevel wbits p0 = do
def <- liftIO $ Z.initDeflate (fromCompressionLevel clevel) wbits
r <- for p0 $ \bs -> do
popper <- liftIO (Z.feedDeflate def bs)
fromPopper popper
mbs <- liftIO $ Z.finishDeflate def
case mbs of
Just bs -> yield bs
Nothing -> return ()
return r
fromPopper :: MonadIO m => Z.Popper -> Producer' B.ByteString m ()
fromPopper pop = loop where
loop = do
mbs <- liftIO pop
case mbs of
Nothing -> return ()
Just bs -> yield bs >> loop
fromCompressionLevel :: ZC.CompressionLevel -> Int
fromCompressionLevel level = case level of
ZC.DefaultCompression -> 1
ZC.NoCompression -> 0
ZC.BestSpeed -> 1
ZC.BestCompression -> 9
ZC.CompressionLevel n
| n >= 0 && n <= 9 -> fromIntegral n
_ -> error "CompressLevel must be in the range 1..9"