module Exomizer.Raw
(
CrunchOptions
, coEncoding
, coMaxPasses
, coMaxLen
, coMaxOffset
, coUseLiteralSequences
, coFavourSpeed
, defaultCrunchOptions
, validCrunchOptions
, CrunchInfo
, ciLiteralSequencesUsed
, ciNeededSafetyOffset
, ciUsedEncoding
, Direction(..)
, ReadWrite(..)
, forward
, backwards
, rawCrunch
, rawCrunch_
, rawDecrunch
) where
import Data.ByteString (ByteString)
import qualified Data.ByteString as BS
import Exomizer.Data.Args
import Exomizer.Data.Direction
import Exomizer.Extern.Crunch
rawCrunch :: ReadWrite -> CrunchOptions -> ByteString -> (ByteString, CrunchInfo)
{-# INLINABLE rawCrunch #-}
rawCrunch (readDir `ReadWrite` writeDir) co bs =
let
(bs', ci) = crunchBackwards co (ifForward writeDir BS.reverse bs)
in
(ifForward readDir BS.reverse bs', ci)
rawCrunch_ :: ReadWrite -> CrunchOptions -> ByteString -> ByteString
{-# INLINABLE rawCrunch_ #-}
rawCrunch_ readWrite args = fst . rawCrunch readWrite args
rawDecrunch :: ReadWrite -> ByteString -> ByteString
{-# INLINABLE rawDecrunch #-}
rawDecrunch (readDir `ReadWrite` writeDir) bs =
let
bs' = deCrunchForward (ifBackwards readDir BS.reverse bs)
in
ifBackwards writeDir BS.reverse bs'