content: {-# LANGUAGE RecordWildCards #-}
  
  module Database.TigerBeetle.Internal.FFI.Client.ClusterId where
  
  import Data.WideWord
  import Data.Word
  import Database.TigerBeetle.ClusterId
  import Foreign (Bits (..), Storable (..))
  import Foreign.Marshal.Alloc (allocaBytes)
  import Foreign.Ptr (Ptr, plusPtr)
  
  withClusterIdPointer :: ClusterId -> (Ptr Word8 -> IO a) -> IO a
  withClusterIdPointer clusterId f = allocaBytes 16 $ \clusterIdPtr -> do
    pokeClusterId clusterIdPtr clusterId.getClusterId
    f clusterIdPtr
  
  pokeClusterId :: Ptr Word8 -> Word128 -> IO ()
  pokeClusterId ptr Word128{..} =
    pokeWord64LE ptr word128Lo64
      >> pokeWord64LE (plusPtr ptr 8) word128Hi64
  
  pokeWord64LE :: Ptr Word8 -> Word64 -> IO ()
  pokeWord64LE ptr w = do
    pokeByteOff ptr 0 (fromIntegral (shiftR w 0) :: Word8)
    pokeByteOff ptr 1 (fromIntegral (shiftR w 8) :: Word8)
    pokeByteOff ptr 2 (fromIntegral (shiftR w 16) :: Word8)
    pokeByteOff ptr 3 (fromIntegral (shiftR w 24) :: Word8)
    pokeByteOff ptr 4 (fromIntegral (shiftR w 32) :: Word8)
    pokeByteOff ptr 5 (fromIntegral (shiftR w 40) :: Word8)
    pokeByteOff ptr 6 (fromIntegral (shiftR w 48) :: Word8)
  