module Edges.Cereal.Put
where

import Edges.Prelude
import Edges.Types
import Data.Serialize.Put
import qualified PrimitiveExtras.PrimArray as PrimArray
import qualified PrimitiveExtras.PrimMultiArray as PrimMultiArray


int :: Putter Int
int = putInt64le . fromIntegral

nodeCounts :: Putter (NodeCounts entity)
nodeCounts (NodeCounts pa) =
  PrimArray.cerealPut int putWord32le pa

edges :: Putter (Edges a b)
edges (Edges targetSpaceValue mpaValue) = targetSpace <> mpa where
  targetSpace = int targetSpaceValue
  mpa = PrimMultiArray.cerealPut int putWord32le mpaValue

node :: Putter (Node a)
node (Node x) = int x