26 lines
787 B
Haskell
26 lines
787 B
Haskell
module Codec.Archive.Zip.Conduit.Internal
|
|
( zipError
|
|
, sizeCRC
|
|
) where
|
|
|
|
import Control.Monad.Catch (MonadThrow, throwM)
|
|
import qualified Data.ByteString as BS
|
|
import qualified Data.Conduit as C
|
|
import Data.Digest.CRC32 (crc32Update)
|
|
import Data.Word (Word32)
|
|
|
|
import Codec.Archive.Zip.Conduit.Types
|
|
|
|
zipError :: MonadThrow m => String -> m a
|
|
zipError = throwM . ZipError
|
|
|
|
passthroughFold :: Monad m => (a -> b -> a) -> a -> C.ConduitM b b m a
|
|
passthroughFold f z = C.await >>= maybe
|
|
(return z)
|
|
(\x -> do
|
|
C.yield x
|
|
passthroughFold f (f z x))
|
|
|
|
sizeCRC :: (Monad m, Integral n) => C.ConduitM BS.ByteString BS.ByteString m (n, Word32)
|
|
sizeCRC = passthroughFold (\(l, c) b -> (l + fromIntegral (BS.length b), crc32Update c b)) (0, 0)
|