packages feed

byteslice-0.2.10.0: src/Data/Bytes/Encode/BigEndian.hs

{-# language BangPatterns #-}
{-# language TypeApplications #-}

module Data.Bytes.Encode.BigEndian
  ( word16
  , word32
  , word64
  , int16
  , int32
  , int64
  ) where

import Control.Monad.ST.Run (runByteArrayST)
import Data.Bits (unsafeShiftR)
import Data.Bytes.Types (Bytes)
import Data.Int (Int16,Int32,Int64)
import Data.Primitive (ByteArray)
import Data.Word (Word8,Word16,Word32,Word64)

import qualified Data.Bytes.Pure as Pure
import qualified Data.Primitive as PM

-- | Encode a 32-bit signed integer as 4 bytes.
int32 :: Int32 -> Bytes
{-# inline int32 #-}
int32 = word32 . fromIntegral @Int32 @Word32 

-- | Encode a 32-bit unsigned integer as 4 bytes.
word32 :: Word32 -> Bytes
word32 !w = Pure.fromByteArray (word32U w)

word32U :: Word32 -> ByteArray
word32U !w = runByteArrayST $ do
  arr <- PM.newByteArray 4
  PM.writeByteArray arr 0 (fromIntegral @Word32 @Word8 (unsafeShiftR w 24))
  PM.writeByteArray arr 1 (fromIntegral @Word32 @Word8 (unsafeShiftR w 16))
  PM.writeByteArray arr 2 (fromIntegral @Word32 @Word8 (unsafeShiftR w 8))
  PM.writeByteArray arr 3 (fromIntegral @Word32 @Word8 w)
  PM.unsafeFreezeByteArray arr

-- | Encode a 16-bit signed integer as 4 bytes.
int16 :: Int16 -> Bytes
{-# inline int16 #-}
int16 = word16 . fromIntegral @Int16 @Word16 

-- | Encode a 16-bit unsigned integer as 4 bytes.
word16 :: Word16 -> Bytes
word16 !w = Pure.fromByteArray (word16U w)

word16U :: Word16 -> ByteArray
word16U !w = runByteArrayST $ do
  arr <- PM.newByteArray 2
  PM.writeByteArray arr 0 (fromIntegral @Word16 @Word8 (unsafeShiftR w 8))
  PM.writeByteArray arr 1 (fromIntegral @Word16 @Word8 w)
  PM.unsafeFreezeByteArray arr

-- | Encode a 16-bit signed integer as 4 bytes.
int64 :: Int64 -> Bytes
{-# inline int64 #-}
int64 = word64 . fromIntegral @Int64 @Word64 

-- | Encode a 16-bit unsigned integer as 4 bytes.
word64 :: Word64 -> Bytes
word64 !w = Pure.fromByteArray (word64U w)

word64U :: Word64 -> ByteArray
word64U !w = runByteArrayST $ do
  arr <- PM.newByteArray 8
  PM.writeByteArray arr 0 (fromIntegral @Word64 @Word8 (unsafeShiftR w 56))
  PM.writeByteArray arr 1 (fromIntegral @Word64 @Word8 (unsafeShiftR w 48))
  PM.writeByteArray arr 2 (fromIntegral @Word64 @Word8 (unsafeShiftR w 40))
  PM.writeByteArray arr 3 (fromIntegral @Word64 @Word8 (unsafeShiftR w 32))
  PM.writeByteArray arr 4 (fromIntegral @Word64 @Word8 (unsafeShiftR w 24))
  PM.writeByteArray arr 5 (fromIntegral @Word64 @Word8 (unsafeShiftR w 16))
  PM.writeByteArray arr 6 (fromIntegral @Word64 @Word8 (unsafeShiftR w 8))
  PM.writeByteArray arr 7 (fromIntegral @Word64 @Word8 w)
  PM.unsafeFreezeByteArray arr