{-# language MagicHash #-}
{-# language UnboxedTuples #-}
module Data.Primitive.PrimArray.Atomic
( casPrimArray
, fetchAddPrimArray
, fetchSubPrimArray
, fetchAndPrimArray
, fetchNandPrimArray
, fetchOrPrimArray
, fetchXorPrimArray
) where
import Control.Monad.Primitive (PrimMonad,PrimState,primitive)
import Data.Primitive (MutablePrimArray(..))
import Data.Primitive.Class.Atomic (PrimMach,primMachToInt#,primMachFromInt#)
import GHC.Exts
casPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> a
-> m a
{-# INLINE casPrimArray #-}
casPrimArray (MutablePrimArray arr#) (I# i#) old new =
primitive $ \s0 -> case casIntArray# arr# i# (primMachToInt# old) (primMachToInt# new) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchAddPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> m a
{-# INLINE fetchAddPrimArray #-}
fetchAddPrimArray (MutablePrimArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchAddIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchSubPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> m a
{-# INLINE fetchSubPrimArray #-}
fetchSubPrimArray (MutablePrimArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchSubIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchAndPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> m a
{-# INLINE fetchAndPrimArray #-}
fetchAndPrimArray (MutablePrimArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchAndIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchNandPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> m a
{-# INLINE fetchNandPrimArray #-}
fetchNandPrimArray (MutablePrimArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchNandIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchOrPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> m a
{-# INLINE fetchOrPrimArray #-}
fetchOrPrimArray (MutablePrimArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchOrIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)
fetchXorPrimArray :: (PrimMonad m, PrimMach a)
=> MutablePrimArray (PrimState m) a
-> Int
-> a
-> m a
{-# INLINE fetchXorPrimArray #-}
fetchXorPrimArray (MutablePrimArray arr#) (I# i#) val =
primitive $ \s0 -> case fetchXorIntArray# arr# i# (primMachToInt# val) s0 of
(# s1, r #) -> (# s1, primMachFromInt# r #)