{-# Language TemplateHaskell #-}
import Control.Monad.Trans.Resource
import Data.Conduit
import qualified Data.Conduit.List as CL
import Data.Conduit.LZ4
import Test.QuickCheck
import Data.ByteString.Arbitrary
import System.Exit
import Control.Monad
import Data.Monoid
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
prop_lz4_identity (NonNegative a) (Positive n) (Positive m) (ABS bs) = ioProperty $ do
res <- runResourceT $ yield bs $$ rechunk n =$= compress (Just a) =$= rechunk m =$= decompress =$= CL.consume
return (bs == BS.concat res)
prop_rechunk_identity (Positive n) (ABS bs) = runConduitPure $ do
res <- yield bs $$ rechunk n =$= CL.consume
return (bs == BS.concat res)
rechunk size = go BSL.empty
where
go buf = do
bs <- await
case bs of
Nothing | BSL.null buf -> return ()
Nothing -> yield $ BSL.toStrict buf
Just bs' -> work (buf <> BSL.fromStrict bs')
work buf
| BSL.length buf < size = go buf
| otherwise = let (t, d) = BSL.splitAt size buf in do
yield $ BSL.toStrict t
work d
return []
main :: IO ()
main = do
res <- $quickCheckAll
when (not res) exitFailure