module Rattletrap.Vector where

import Rattletrap.CompressedWord

import qualified Data.Binary.Bits.Get as BinaryBit
import qualified Data.Binary.Bits.Put as BinaryBit

data Vector = Vector
  { vectorBitSize :: CompressedWord
  , vectorDx :: CompressedWord
  , vectorDy :: CompressedWord
  , vectorDz :: CompressedWord
  } deriving (Eq, Ord, Show)

getVector :: BinaryBit.BitGet Vector
getVector = do
  bitSize <- getCompressedWord 19
  let limit = 2 ^ (compressedWordValue bitSize + 2)
  dx <- getCompressedWord limit
  dy <- getCompressedWord limit
  dz <- getCompressedWord limit
  pure
    Vector
    {vectorBitSize = bitSize, vectorDx = dx, vectorDy = dy, vectorDz = dz}

putVector :: Vector -> BinaryBit.BitPut ()
putVector vector = do
  putCompressedWord (vectorBitSize vector)
  putCompressedWord (vectorDx vector)
  putCompressedWord (vectorDy vector)
  putCompressedWord (vectorDz vector)