{-# language MagicHash #-}
{-# language UnboxedTuples #-}
module Data.Primitive.ByteArray.Atomic
( casByteArray
, fetchAddByteArray
, fetchSubByteArray
, fetchAndByteArray
, fetchNandByteArray
, fetchOrByteArray
, fetchXorByteArray
) where
import Control.Monad.Primitive (PrimMonad,PrimState,primitive)
import Data.Primitive (MutableByteArray(..))
import Data.Primitive.Class.Atomic (PrimMach,primMachToInt#,primMachFromInt#)
import GHC.Exts
casByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> a
-> m a
{-# INLINE casByteArray #-}
casByteArray (MutableByteArray arr#) (I# i#) old new =
primitive $ \s0 -> case casIntArray# arr# i# (primMachToInt# old) (primMachToInt# new) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchAddByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> m a
{-# INLINE fetchAddByteArray #-}
fetchAddByteArray (MutableByteArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchAddIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchSubByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> m a
{-# INLINE fetchSubByteArray #-}
fetchSubByteArray (MutableByteArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchSubIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchAndByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> m a
{-# INLINE fetchAndByteArray #-}
fetchAndByteArray (MutableByteArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchAndIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchNandByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> m a
{-# INLINE fetchNandByteArray #-}
fetchNandByteArray (MutableByteArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchNandIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchOrByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> m a
{-# INLINE fetchOrByteArray #-}
fetchOrByteArray (MutableByteArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchOrIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchXorByteArray :: (PrimMonad m, PrimMach a)
=> MutableByteArray (PrimState m)
-> Int
-> a
-> m a
{-# INLINE fetchXorByteArray #-}
fetchXorByteArray (MutableByteArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchXorIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)