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