packages feed

hstar-0.1.0.2: src/Compression.cpphs

module Compression ( compressionByFileExt
                   , decompressor
                   , compressor
                   ) where

#ifdef BROTLI
import qualified Codec.Compression.Brotli    as Brotli
#endif
import qualified Codec.Compression.BZip      as BZip
import qualified Codec.Compression.GZip      as GZip
import qualified Codec.Compression.Lzma      as Lzma
import qualified Codec.Compression.Zlib      as Zlib
import qualified Codec.Compression.Zstd.Lazy as Zstd
import qualified Codec.Lz4                   as Lz4
import           Codec.Lzip                  as Lzip
import qualified Data.ByteString.Lazy        as BSL
import           Data.List                   (isSuffixOf)

data Compressor = Lzma
    | Lz
    | Bz2
    | GZip
    | Zstd
    | Deflate
    | Lz4
#ifdef BROTLI
    | Brotli
#endif
    | None

compressionByFileExt :: FilePath -> Compressor
compressionByFileExt fp | ".tgz" `isSuffixOf` fp     = GZip
                        | ".tar.bz2" `isSuffixOf` fp = Bz2
                        | ".tar.bz" `isSuffixOf` fp  = Bz2
                        | ".tbz2" `isSuffixOf` fp    = Bz2
                        | ".tbz" `isSuffixOf` fp     = Bz2
                        | ".tar.gz" `isSuffixOf` fp  = GZip
                        | ".tar.xz" `isSuffixOf` fp  = Lzma
                        | ".txz" `isSuffixOf` fp     = Lzma
                        | ".tar.lz" `isSuffixOf` fp  = Lz
                        | ".tlz" `isSuffixOf` fp     = Lz
                        | ".tar.zst" `isSuffixOf` fp = Zstd
                        | ".tar.Z" `isSuffixOf` fp   = Deflate
                        | ".tar.lz4" `isSuffixOf` fp = Lz4
#ifdef BROTLI
                        | ".tbr" `isSuffixOf` fp     = Brotli
                        | ".tar.br" `isSuffixOf` fp  = Brotli
#endif
                        | ".tar" `isSuffixOf` fp     = None
                        | otherwise                  = error "Suffix not supported or invalid."

decompressor :: Compressor -> (BSL.ByteString -> BSL.ByteString)
decompressor Lzma    = Lzma.decompress
decompressor Bz2     = BZip.decompress
decompressor GZip    = GZip.decompress
decompressor Lz      = Lzip.decompress
decompressor Zstd    = Zstd.decompress
decompressor Deflate = Zlib.decompress
decompressor Lz4     = Lz4.decompress
#ifdef BROTLI
decompressor Brotli  = Brotli.decompress
#endif
decompressor None    = id

compressor :: Compressor -> (BSL.ByteString -> BSL.ByteString)
compressor Lzma    = Lzma.compress
compressor Bz2     = BZip.compress
compressor GZip    = GZip.compress
compressor Lz      = Lzip.compress
compressor Zstd    = Zstd.compress 3
compressor Deflate = Zlib.compress
compressor Lz4     = Lz4.compress
#ifdef BROTLI
compressor Brotli  = Brotli.compress
#endif
compressor None    = id