module Rattletrap.Decode.Vector ( decodeVectorBits ) where import Rattletrap.Decode.Common import Rattletrap.Decode.CompressedWord import Rattletrap.Type.CompressedWord import Rattletrap.Type.Vector decodeVectorBits :: DecodeBits Vector decodeVectorBits = do size <- decodeCompressedWordBits 19 let limit = getLimit size bias = getBias size Vector bias <$> fmap (fromDelta bias) (decodeCompressedWordBits limit) <*> fmap (fromDelta bias) (decodeCompressedWordBits limit) <*> fmap (fromDelta bias) (decodeCompressedWordBits limit) getLimit :: CompressedWord -> Word getLimit = (2 ^) . (+ 2) . compressedWordValue getBias :: CompressedWord -> Word getBias = (2 ^) . (+ 1) . compressedWordValue fromDelta :: Word -> CompressedWord -> Int fromDelta bias x = fromIntegral (compressedWordValue x) - fromIntegral bias