File: Zstd.hs

package info (click to toggle)
haskell-conduit-zstd 0.0.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 68 kB
  • sloc: haskell: 46; makefile: 5
file content (37 lines) | stat: -rw-r--r-- 1,149 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
module Data.Conduit.Zstd
    ( compress
    , decompress
    ) where

import qualified Data.Conduit as C
import qualified Data.ByteString as B
import qualified Codec.Compression.Zstd.Streaming as Z
import           Control.Monad.IO.Class (MonadIO, liftIO)
import           Control.Exception.Base (throwIO)
import           System.IO.Error (userError)
import           Data.Maybe (fromMaybe)


-- | compression conduit
compress :: MonadIO m =>
        Int -- ^ compression level
        -> C.ConduitT B.ByteString B.ByteString m ()
compress level = liftIO (Z.compress level) >>= go

-- | decompression conduit
decompress :: MonadIO m => C.ConduitT B.ByteString B.ByteString m ()
decompress = liftIO Z.decompress >>= go

go :: MonadIO m => Z.Result -> C.ConduitT B.ByteString B.ByteString m ()
go (Z.Produce r next) = do
    C.yield r
    liftIO next >>= go
go input@(Z.Consume f) = do
    next <- C.await
    case next of
      Just chunk | B.null chunk ->
        go input
      _ ->
        liftIO (f $ fromMaybe B.empty next) >>= go
go (Z.Error m e) = liftIO (throwIO $ userError ("ZStandard error :" ++ m ++ ": " ++ e))
go (Z.Done r) = C.yield r