{-# LANGUAGE MagicHash #-} {-# LANGUAGE ScopedTypeVariables #-} module Data.BA where import GHC.Exts import Control.Monad.Primitive import Data.Primitive.Types import Data.Primitive.ByteArray -- | WARNING: Unsafe to use this on packed C structs. writeAtByte :: (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> a -> m () writeAtByte buf offset a = writeByteArray buf (div offset $ I# (sizeOf# a)) a {-# INLINE writeAtByte #-} readAtByte :: forall a m. (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readAtByte buf offset = readByteArray buf (div offset $ I# (sizeOf# (undefined :: a))) {-# INLINE readAtByte #-}