twee-lib-2.1: src/Data/Primitive/ByteArray/Checked.hs
-- | A bounds-checked version of 'Data.Primitive.ByteArray'.
-- See that module for documentation.
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Primitive.ByteArray.Checked(
module Data.Primitive.ByteArray,
module Data.Primitive.ByteArray.Checked) where
import Control.Monad.Primitive
import qualified Data.Primitive.ByteArray as P
import Data.Primitive(Prim)
import Data.Primitive.ByteArray(
ByteArray(..), MutableByteArray(..),
newByteArray, newPinnedByteArray, newAlignedPinnedByteArray,
byteArrayContents, mutableByteArrayContents,
sameMutableByteArray,
unsafeFreezeByteArray, unsafeThawByteArray,
sizeofByteArray, sizeofMutableByteArray)
import Data.Primitive.Checked
import Data.Word
instance Sized ByteArray where
size = sizeofByteArray
instance Sized (MutableByteArray m) where
size = sizeofMutableByteArray
{-# INLINE readByteArray #-}
readByteArray :: forall m a. (PrimMonad m, Prim a) => MutableByteArray (PrimState m) -> Int -> m a
readByteArray arr n =
checkPrim (undefined :: a) arr n $
P.readByteArray arr n
{-# INLINE writeByteArray #-}
writeByteArray :: (PrimMonad m, Prim a) => MutableByteArray (PrimState m) -> Int -> a -> m ()
writeByteArray arr n x =
checkPrim x arr n $
P.writeByteArray arr n x
{-# INLINE indexByteArray #-}
indexByteArray :: forall a. Prim a => ByteArray -> Int -> a
indexByteArray arr n =
checkPrim (undefined :: a) arr n $
P.indexByteArray arr n
{-# INLINE copyByteArray #-}
copyByteArray :: PrimMonad m => MutableByteArray (PrimState m) -> Int -> ByteArray -> Int -> Int -> m ()
copyByteArray arr1 n1 arr2 n2 len =
range arr1 n1 len $
range arr2 n2 len $
P.copyByteArray arr1 n1 arr2 n2 len
{-# INLINE moveByteArray #-}
moveByteArray :: PrimMonad m => MutableByteArray (PrimState m) -> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
moveByteArray arr1 n1 arr2 n2 len =
range arr1 n1 len $
range arr2 n2 len $
P.moveByteArray arr1 n1 arr2 n2 len
{-# INLINE copyMutableByteArray #-}
copyMutableByteArray :: PrimMonad m => MutableByteArray (PrimState m) -> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
copyMutableByteArray arr1 n1 arr2 n2 len =
range arr1 n1 len $
range arr2 n2 len $
P.copyMutableByteArray arr1 n1 arr2 n2 len
{-# INLINE setByteArray #-}
setByteArray :: (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> Int -> a -> m ()
setByteArray arr n len x =
rangePrim x arr n len $
P.setByteArray arr n len x
{-# INLINE fillByteArray #-}
fillByteArray :: PrimMonad m => MutableByteArray (PrimState m) -> Int -> Int -> Word8 -> m ()
fillByteArray = setByteArray