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.Lzo as Lzo #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 | Lzo #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 | ".tar.lzo" `isSuffixOf` fp = Lzo | ".tzo" `isSuffixOf` fp = Lzo #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 decompressor Lzo = Lzo.decompressFile #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 Lzo = Lzo.compressFile 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