module Codec.HaskellCompression.Unzip where
import Data.List
import qualified Data.Bimap as Map
import Data.Maybe
import Data.BooleanList
import qualified Data.ByteString as B (pack,unpack,ByteString)
import Control.Arrow
import Codec.HaskellCompression.Shared
import Debug.Trace
import Data.Char
takeLast n xs = drop (length xsn) xs
unzipit = via (\xs -> let (headxs,tailxs) = splitAt (fromIntegral startingLength) xs in if xs == [] then [] else unzipit' initdb headxs tailxs)
unzipit' :: Map.Bimap [[Bool]] Int -> [Bool] -> [Bool] -> [Bool]
unzipit' library buffer xs = let
librarySize = Map.size library
keyLength = boolsRequiredForInteger $ (+1) $ librarySize
(headxs,tailxs) = splitAt (fromIntegral keyLength) xs
Just key = booleanListToInteger buffer `Map.lookupR` library
ref = fromJust $ if (booleanListToInteger headxs) == librarySize then Just key else (booleanListToInteger headxs) `Map.lookupR` library
in if length headxs < (fromIntegral keyLength) then concat $ map (padBooleanList 8. takeLast 8) $ library Map.!> booleanListToInteger buffer
else case Map.lookup [pruneBooleanList buffer,pruneBooleanList headxs] library of
Just n -> unzipit' library (integerToBooleanList n) tailxs
Nothing -> (concat $ map ( padBooleanList 8 . takeLast 8) key) ++ (unzipit' ((Map.insert ( map pruneBooleanList $ concat $ [key ,take 1 ref])) (librarySize) library) headxs tailxs)