packages feed

hstar-0.1.0.3: 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
#ifdef SNAPPY
import qualified Codec.Compression.Snappy.BSL as Snappy
#endif
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
#ifdef SNAPPY
    | Snappy
#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
#ifdef SNAPPY
                        | ".tar.sz" `isSuffixOf` fp  = Snappy
#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
#ifdef SNAPPY
decompressor Snappy  = Snappy.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
#ifdef SNAPPY
compressor Snappy  = Snappy.compress
#endif
compressor None    = id