    {-# LANGUAGE RankNTypes #-}

    -- | This module exports utilities to compress and decompress GZip @pipes@
    -- streams.

    module Pipes.GZip (
      -- * Streams
        decompress
      , decompress'
      , compress

      -- * Compression level
      , Pipes.Zlib.CompressionLevel
      , Pipes.Zlib.defaultCompression
      , Pipes.Zlib.noCompression
      , Pipes.Zlib.bestSpeed
      , Pipes.Zlib.bestCompression
      , Pipes.Zlib.compressionLevel
      ) where

    import qualified Data.Streaming.Zlib       as Zlib
    import qualified Data.ByteString           as B
    import           Pipes
    import qualified Pipes.Zlib

    --------------------------------------------------------------------------------

    -- | Decompress bytes flowing from a 'Producer'.
    --
    -- @
    -- 'decompress' :: 'MonadIO' m
    --            => 'Producer' 'B.ByteString' m r
    --            -> 'Producer' 'B.ByteString' m r
    -- @
    decompress
      :: MonadIO m
      => Proxy x' x () B.ByteString m r -- ^ Compressed stream
      -> Proxy x' x () B.ByteString m r -- ^ Decompressed stream
    decompress = Pipes.Zlib.decompress gzWindowBits
    {-# INLINABLE decompress #-}

    -- | Decompress bytes flowing from a 'Producer', returning any leftover input
    -- that follows the compressed stream.
    decompress'
      :: MonadIO m
      => Producer B.ByteString m r -- ^ Compressed stream
      -> Producer B.ByteString m (Either (Producer B.ByteString m r) r)
         -- ^ Decompressed stream, returning either a 'Producer' of the leftover input
         -- or the return value from the input 'Producer'.
    decompress' = Pipes.Zlib.decompress' gzWindowBits
    {-# INLINABLE decompress' #-}

    -- | Compress bytes flowing from a 'Producer'.
    --
    -- @
    -- 'compress' :: 'MonadIO' m
    --          => 'ZC.CompressionLevel'
    --          -> 'Producer' 'B.ByteString' m r
    --          -> 'Producer' 'B.ByteString' m r
    -- @
    compress
      :: MonadIO m
      => Pipes.Zlib.CompressionLevel
      -> Proxy x' x () B.ByteString m r -- ^ Decompressed stream
      -> Proxy x' x () B.ByteString m r -- ^ Compressed stream
    compress clevel = Pipes.Zlib.compress clevel gzWindowBits
    {-# INLINABLE compress #-}

    gzWindowBits :: Zlib.WindowBits
    gzWindowBits = Zlib.WindowBits 31