module Rattletrap.Primitive.Int8Vector where

import Rattletrap.Primitive.Int8

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

data Int8Vector = Int8Vector
  { int8VectorX :: Maybe Int8
  , int8VectorY :: Maybe Int8
  , int8VectorZ :: Maybe Int8
  } deriving (Eq, Ord, Show)

getInt8Vector :: BinaryBit.BitGet Int8Vector
getInt8Vector = do
  x <- getInt8VectorField
  y <- getInt8VectorField
  z <- getInt8VectorField
  pure (Int8Vector x y z)

putInt8Vector :: Int8Vector -> BinaryBit.BitPut ()
putInt8Vector int8Vector = do
  putInt8VectorField (int8VectorX int8Vector)
  putInt8VectorField (int8VectorY int8Vector)
  putInt8VectorField (int8VectorZ int8Vector)

getInt8VectorField :: BinaryBit.BitGet (Maybe Int8)
getInt8VectorField = do
  hasField <- BinaryBit.getBool
  if hasField
    then do
      field <- getInt8Bits
      pure (Just field)
    else pure Nothing

putInt8VectorField :: Maybe Int8 -> BinaryBit.BitPut ()
putInt8VectorField maybeField =
  case maybeField of
    Nothing -> BinaryBit.putBool False
    Just field -> do
      BinaryBit.putBool True
      putInt8Bits field