module Codec.Compression.Hopfli (
Format(..)
, CompressOptions(..)
, VerboseLevel(..)
, compressWith
, Codec.Compression.Hopfli.compress
, defaultCompressOptions
, defaultFormat
) where
import Codec.Compression.Hopfli.Raw as Raw
import Data.ByteString
import Foreign.C.Types (CInt)
data VerboseLevel = NONE | VERBOSE | VERY_VERBOSE deriving (Show, Eq)
data CompressOptions = CompressOptions { verbose :: VerboseLevel
, numIterations :: Int
, blockSplitting :: Bool
, blockSplittingLast :: Bool
, blockSplittingMax :: Int }
defaultCompressOptions :: CompressOptions
defaultCompressOptions = CompressOptions { verbose = NONE, numIterations = 10, blockSplitting = True, blockSplittingLast = False, blockSplittingMax = 15 }
defaultFormat :: Format
defaultFormat = ZLIB
boolToInt :: Bool -> CInt
boolToInt True = 1
boolToInt False = 0
toOptions :: CompressOptions -> Options
toOptions (CompressOptions {..})
= Options verbose' verboseMore (fromIntegral numIterations) (boolToInt blockSplitting) (boolToInt blockSplittingLast) (fromIntegral blockSplittingMax)
where verbose' = boolToInt $ VERBOSE == verbose || VERY_VERBOSE == verbose
verboseMore = boolToInt $ VERY_VERBOSE == verbose
compressWith :: CompressOptions -> Format -> ByteString -> ByteString
compressWith options = Raw.compress (toOptions options)
compress :: ByteString -> ByteString
compress = compressWith defaultCompressOptions defaultFormat