pipes-brotli (empty) → 0.0.0.0
raw patch · 5 files changed
+204/−0 lines, 5 filesdep +QuickCheckdep +basedep +brotlisetup-changed
Dependencies added: QuickCheck, base, brotli, bytestring, pipes, pipes-brotli, pipes-bytestring
Files
- LICENSE +31/−0
- Setup.hs +2/−0
- Test.hs +22/−0
- pipes-brotli.cabal +46/−0
- src/Pipes/Brotli.hs +103/−0
+ LICENSE view
@@ -0,0 +1,31 @@+Copyright (c) 2016, Ben Gamari+ 2019, Herbert Valerio Riedel++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Ben Gamari nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Test.hs view
@@ -0,0 +1,22 @@+import Control.Monad (void)+import Control.Applicative ((<$>))++import Pipes+import Pipes.Brotli+import qualified Pipes.Prelude as PP+import qualified Data.ByteString as BS++import Test.QuickCheck+import Test.QuickCheck.Monadic++roundTrip :: [BS.ByteString] -> Property+roundTrip bss = monadicIO $ do+ bss' <- run $ PP.toListM $ void $ decompress $ compress $ each bss+ monitor $ counterexample $ show bss'+ assert (BS.concat bss' == BS.concat bss)++main :: IO ()+main = quickCheck roundTrip++instance Arbitrary BS.ByteString where+ arbitrary = BS.pack <$> arbitrary
+ pipes-brotli.cabal view
@@ -0,0 +1,46 @@+cabal-version: 1.12 +build-type: Simple +name: pipes-brotli +version: 0.0.0.0 + +synopsis: Brotli (RFC7932) compressors and decompressors for the Pipes package +description: + <http://brotli.org Brotli> (<https://tools.ietf.org/html/rfc7932 RFC7932>) is a generic-purpose lossless compression algorithm suitable for <https://en.wikipedia.org/wiki/HTTP_compression HTTP compression> that compresses data using a combination of a modern variant of the LZ77 algorithm, Huffman coding and 2nd order context modeling. + . + This package provides a @pipes@ interface to the <http://brotli.org Brotli compression algorithm>. + +homepage: http://github.com/hvr/pipes-brotli +bug-reports: http://github.com/hvr/pipes-brotli/issues +license: BSD3 +license-file: LICENSE +author: Ben Gamari, Herbert Valerio Riedel +maintainer: hvr@gnu.org +copyright: (c) 2016 Ben Gamari, 2019 Herbert Valerio Riedel +category: Codec, Compression, Pipes + +source-repository head + type: git + location: https://github.com/hvr/pipes-brotli.git + +library + exposed-modules: Pipes.Brotli + build-depends: base >=4.5 && <4.13, + bytestring == 0.10.*, + pipes >=4.0 && <4.4, + brotli == 0.0.* + hs-source-dirs: src + default-language: Haskell2010 + other-extensions: ScopedTypeVariables + Trustworthy + +test-suite pipes-brotli-tests + type: exitcode-stdio-1.0 + main-is: Test.hs + build-depends: base, + bytestring, + pipes, + pipes-brotli, + + pipes-bytestring == 2.1.*, + QuickCheck == 2.13.* + default-language: Haskell2010
+ src/Pipes/Brotli.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE Trustworthy #-}++-- |+-- Module : Pipes.Brotli+-- Copyright : © 2016 Herbert Valerio Riedel+--+-- Maintainer : hvr@gnu.org+--+-- Compression and decompression of data streams in the \"Brotli\" format (<https://tools.ietf.org/html/rfc7932 RFC7932>)+--+module Pipes.Brotli+ ( -- * Simple interface+ compress+ , decompress++ -- * Extended interface+ -- ** Compression+ , compressWith++ , Brotli.defaultCompressParams+ , Brotli.CompressParams+ , Brotli.compressLevel+ , Brotli.compressWindowSize+ , Brotli.compressMode+ , Brotli.compressSizeHint+ , Brotli.CompressionLevel(..)+ , Brotli.CompressionWindowSize(..)+ , Brotli.CompressionMode(..)++ -- ** Decompression+ , decompressWith++ , Brotli.defaultDecompressParams+ , Brotli.DecompressParams+ , Brotli.decompressDisableRingBufferReallocation++ ) where++import Pipes+import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import qualified Codec.Compression.Brotli as Brotli++-- | Decompress a 'ByteString'.+decompress :: forall m r. MonadIO m+ => Producer ByteString m r+ -> Producer ByteString m (Producer ByteString m r)+decompress = decompressWith Brotli.defaultDecompressParams++-- | Decompress a 'ByteString' with a given set of 'Brotli.DecompressParams'.+decompressWith :: forall m r. MonadIO m+ => Brotli.DecompressParams+ -> Producer ByteString m r+ -> Producer ByteString m (Producer ByteString m r)+decompressWith params prod0 = liftIO (Brotli.decompressIO params) >>= go prod0+ where+ go :: Producer ByteString m r+ -> Brotli.DecompressStream IO+ -> Producer ByteString m (Producer ByteString m r)+ go prod s@(Brotli.DecompressInputRequired more) = do+ mx <- lift $ next prod+ case mx of+ Right (x, prod')+ | BS.null x -> go prod' s+ | otherwise -> liftIO (more x) >>= go prod'+ Left r -> liftIO (more BS.empty) >>= go (return r)+ go prod (Brotli.DecompressOutputAvailable output cont) = do+ yield output+ liftIO cont >>= go prod+ go prod (Brotli.DecompressStreamEnd leftover) =+ return (yield leftover >> prod)+ go _prod (Brotli.DecompressStreamError ecode) =+ fail $ "Pipes.Brotli.decompress: error (" ++ Brotli.showBrotliDecoderErrorCode ecode ++ ")"++-- | Compress a 'ByteString'.+compress :: forall m r. MonadIO m+ => Producer ByteString m r+ -> Producer ByteString m r+compress = compressWith Brotli.defaultCompressParams++-- | Compress a 'ByteString' with a given set of 'Brotli.CompressParams'.+compressWith :: forall m r. MonadIO m+ => Brotli.CompressParams+ -> Producer ByteString m r+ -> Producer ByteString m r+compressWith params prod0 = liftIO (Brotli.compressIO params) >>= go prod0+ where+ go :: Producer ByteString m r+ -> Brotli.CompressStream IO+ -> Producer ByteString m r+ go prod s@(Brotli.CompressInputRequired _flush more) = do+ mx <- lift $ next prod+ case mx of+ Right (x, prod')+ | BS.null x -> go prod' s+ | otherwise -> liftIO (more x) >>= go prod'+ Left r -> liftIO (more BS.empty) >>= go (return r)+ go prod (Brotli.CompressOutputAvailable output cont) = do+ yield output+ liftIO cont >>= go prod+ go prod Brotli.CompressStreamEnd =+ prod