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