module PrimitiveExtras.Cereal.Put
where

import PrimitiveExtras.Prelude
import PrimitiveExtras.Types
import Data.Serialize.Put
import qualified PrimitiveExtras.Monad as Monad


primArray :: Prim element => Putter element -> Putter (PrimArray element)
primArray element primArrayValue =
  size <> elements
  where
    size = putInt64le (fromIntegral (sizeofPrimArray primArrayValue))
    elements = traversePrimArray_ element primArrayValue

primMultiArray :: Prim element => Putter element -> Putter (PrimMultiArray element)
primMultiArray element (PrimMultiArray outerArrayValue) =
  size <> innerArrays
  where
    size = putInt64le (fromIntegral (sizeofUnliftedArray outerArrayValue))
    innerArrays = Monad.traverseUnliftedArray_ (primArray element) outerArrayValue