129 lines
3.9 KiB
Haskell
129 lines
3.9 KiB
Haskell
|
-----------------------------------------------------------------------------
|
||
|
-- |
|
||
|
-- Copyright : (c) 2006-2014 Duncan Coutts
|
||
|
-- License : BSD-style
|
||
|
--
|
||
|
-- Maintainer : duncan@community.haskell.org
|
||
|
--
|
||
|
-- Compression and decompression of data streams in the gzip format.
|
||
|
--
|
||
|
-- The format is described in detail in RFC #1952:
|
||
|
-- <http://www.ietf.org/rfc/rfc1952.txt>
|
||
|
--
|
||
|
-- See also the zlib home page: <http://zlib.net/>
|
||
|
--
|
||
|
-----------------------------------------------------------------------------
|
||
|
module Codec.Compression.GZip (
|
||
|
|
||
|
-- | This module provides pure functions for compressing and decompressing
|
||
|
-- streams of data in the gzip format and represented by lazy 'ByteString's.
|
||
|
-- This makes it easy to use either in memory or with disk or network IO.
|
||
|
--
|
||
|
-- For example a simple gzip compression program is just:
|
||
|
--
|
||
|
-- > import qualified Data.ByteString.Lazy as ByteString
|
||
|
-- > import qualified Codec.Compression.GZip as GZip
|
||
|
-- >
|
||
|
-- > main = ByteString.interact GZip.compress
|
||
|
--
|
||
|
-- Or you could lazily read in and decompress a @.gz@ file using:
|
||
|
--
|
||
|
-- > content <- fmap GZip.decompress (readFile file)
|
||
|
--
|
||
|
|
||
|
-- * Simple compression and decompression
|
||
|
compress,
|
||
|
decompress,
|
||
|
|
||
|
-- * Extended api with control over compression parameters
|
||
|
compressWith,
|
||
|
decompressWith,
|
||
|
|
||
|
CompressParams(..), defaultCompressParams,
|
||
|
DecompressParams(..), defaultDecompressParams,
|
||
|
|
||
|
-- ** The compression parameter types
|
||
|
CompressionLevel(..),
|
||
|
defaultCompression,
|
||
|
noCompression,
|
||
|
bestSpeed,
|
||
|
bestCompression,
|
||
|
compressionLevel,
|
||
|
Method(..),
|
||
|
deflateMethod,
|
||
|
WindowBits(..),
|
||
|
defaultWindowBits,
|
||
|
windowBits,
|
||
|
MemoryLevel(..),
|
||
|
defaultMemoryLevel,
|
||
|
minMemoryLevel,
|
||
|
maxMemoryLevel,
|
||
|
memoryLevel,
|
||
|
CompressionStrategy(..),
|
||
|
defaultStrategy,
|
||
|
filteredStrategy,
|
||
|
huffmanOnlyStrategy,
|
||
|
|
||
|
) where
|
||
|
|
||
|
import Data.ByteString.Lazy (ByteString)
|
||
|
|
||
|
import qualified Codec.Compression.Zlib.Internal as Internal
|
||
|
import Codec.Compression.Zlib.Internal hiding (compress, decompress)
|
||
|
|
||
|
|
||
|
-- | Decompress a stream of data in the gzip format.
|
||
|
--
|
||
|
-- There are a number of errors that can occur. In each case an exception will
|
||
|
-- be thrown. The possible error conditions are:
|
||
|
--
|
||
|
-- * if the stream does not start with a valid gzip header
|
||
|
--
|
||
|
-- * if the compressed stream is corrupted
|
||
|
--
|
||
|
-- * if the compressed stream ends permaturely
|
||
|
--
|
||
|
-- Note that the decompression is performed /lazily/. Errors in the data stream
|
||
|
-- may not be detected until the end of the stream is demanded (since it is
|
||
|
-- only at the end that the final checksum can be checked). If this is
|
||
|
-- important to you, you must make sure to consume the whole decompressed
|
||
|
-- stream before doing any IO action that depends on it.
|
||
|
--
|
||
|
decompress :: ByteString -> ByteString
|
||
|
decompress = decompressWith defaultDecompressParams
|
||
|
|
||
|
|
||
|
-- | Like 'decompress' but with the ability to specify various decompression
|
||
|
-- parameters. Typical usage:
|
||
|
--
|
||
|
-- > decompressWith defaultCompressParams { ... }
|
||
|
--
|
||
|
decompressWith :: DecompressParams -> ByteString -> ByteString
|
||
|
decompressWith = Internal.decompress gzipFormat
|
||
|
|
||
|
|
||
|
-- | Compress a stream of data into the gzip format.
|
||
|
--
|
||
|
-- This uses the default compression parameters. In partiular it uses the
|
||
|
-- default compression level which favours a higher compression ratio over
|
||
|
-- compression speed, though it does not use the maximum compression level.
|
||
|
--
|
||
|
-- Use 'compressWith' to adjust the compression level or other compression
|
||
|
-- parameters.
|
||
|
--
|
||
|
compress :: ByteString -> ByteString
|
||
|
compress = compressWith defaultCompressParams
|
||
|
|
||
|
|
||
|
-- | Like 'compress' but with the ability to specify various compression
|
||
|
-- parameters. Typical usage:
|
||
|
--
|
||
|
-- > compressWith defaultCompressParams { ... }
|
||
|
--
|
||
|
-- In particular you can set the compression level:
|
||
|
--
|
||
|
-- > compressWith defaultCompressParams { compressLevel = BestCompression }
|
||
|
--
|
||
|
compressWith :: CompressParams -> ByteString -> ByteString
|
||
|
compressWith = Internal.compress gzipFormat
|