module Z.Data.PrimRef
(
PrimRef(..), PrimIORef
, newPrimRef
, readPrimRef
, writePrimRef
, modifyPrimRef
, Prim(..)
, UnliftedRef(..)
, newUnliftedRef
, readUnliftedRef
, writeUnliftedRef
, modifyUnliftedRef
, PrimUnlifted(..)
, Counter
, newCounter
, readCounter
, writeCounter
, modifyCounter
, atomicAddCounter
, atomicSubCounter
, atomicAndCounter
, atomicNandCounter
, atomicOrCounter
, atomicXorCounter
, atomicAddCounter'
, atomicSubCounter'
, atomicAndCounter'
, atomicNandCounter'
, atomicOrCounter'
, atomicXorCounter'
, atomicAddCounter_
, atomicSubCounter_
, atomicAndCounter_
, atomicNandCounter_
, atomicOrCounter_
, atomicXorCounter_
) where
import Control.Monad.Primitive
import Data.Primitive.Types
import Data.Primitive.ByteArray
import GHC.Exts
import GHC.IO
import Z.Data.Array.UnliftedArray
newtype PrimRef s a = PrimRef (MutableByteArray s)
type PrimIORef a = PrimRef RealWorld a
newPrimRef :: (Prim a, PrimMonad m) => a -> m (PrimRef (PrimState m) a)
newPrimRef :: a -> m (PrimRef (PrimState m) a)
newPrimRef a
x = do
MutableByteArray (PrimState m)
mba <- Int -> m (MutableByteArray (PrimState m))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
newByteArray (Int# -> Int
I# (a -> Int#
forall a. Prim a => a -> Int#
sizeOf# a
x))
MutableByteArray (PrimState m) -> Int -> a -> m ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
writeByteArray MutableByteArray (PrimState m)
mba Int
0 a
x
PrimRef (PrimState m) a -> m (PrimRef (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (MutableByteArray (PrimState m) -> PrimRef (PrimState m) a
forall k s (a :: k). MutableByteArray s -> PrimRef s a
PrimRef MutableByteArray (PrimState m)
mba)
{-# INLINE newPrimRef #-}
readPrimRef :: (Prim a, PrimMonad m) => PrimRef (PrimState m) a -> m a
readPrimRef :: PrimRef (PrimState m) a -> m a
readPrimRef (PrimRef MutableByteArray (PrimState m)
mba) = MutableByteArray (PrimState m) -> Int -> m a
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> m a
readByteArray MutableByteArray (PrimState m)
mba Int
0
{-# INLINE readPrimRef #-}
writePrimRef :: (Prim a, PrimMonad m) => PrimRef (PrimState m) a -> a -> m ()
writePrimRef :: PrimRef (PrimState m) a -> a -> m ()
writePrimRef (PrimRef MutableByteArray (PrimState m)
mba) a
x = MutableByteArray (PrimState m) -> Int -> a -> m ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
MutableByteArray (PrimState m) -> Int -> a -> m ()
writeByteArray MutableByteArray (PrimState m)
mba Int
0 a
x
{-# INLINE writePrimRef #-}
modifyPrimRef :: (Prim a, PrimMonad m) => PrimRef (PrimState m) a -> (a -> a) -> m ()
modifyPrimRef :: PrimRef (PrimState m) a -> (a -> a) -> m ()
modifyPrimRef PrimRef (PrimState m) a
ref a -> a
f = PrimRef (PrimState m) a -> m a
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
PrimRef (PrimState m) a -> m a
readPrimRef PrimRef (PrimState m) a
ref m a -> (a -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= PrimRef (PrimState m) a -> a -> m ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
PrimRef (PrimState m) a -> a -> m ()
writePrimRef PrimRef (PrimState m) a
ref (a -> m ()) -> (a -> a) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f
{-# INLINE modifyPrimRef #-}
type Counter = PrimRef RealWorld Int
newCounter :: Int -> IO Counter
newCounter :: Int -> IO Counter
newCounter = Int -> IO Counter
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
a -> m (PrimRef (PrimState m) a)
newPrimRef
{-# INLINE newCounter #-}
readCounter :: Counter -> IO Int
readCounter :: Counter -> IO Int
readCounter = Counter -> IO Int
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
PrimRef (PrimState m) a -> m a
readPrimRef
{-# INLINE readCounter #-}
writeCounter :: Counter -> Int -> IO ()
writeCounter :: Counter -> Int -> IO ()
writeCounter = Counter -> Int -> IO ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
PrimRef (PrimState m) a -> a -> m ()
writePrimRef
{-# INLINE writeCounter #-}
modifyCounter :: Counter -> (Int -> Int) -> IO ()
modifyCounter :: Counter -> (Int -> Int) -> IO ()
modifyCounter = Counter -> (Int -> Int) -> IO ()
forall a (m :: * -> *).
(Prim a, PrimMonad m) =>
PrimRef (PrimState m) a -> (a -> a) -> m ()
modifyPrimRef
{-# INLINE modifyCounter #-}
atomicAddCounter' :: Counter -> Int -> IO Int
{-# INLINE atomicAddCounter' #-}
atomicAddCounter' :: Counter -> Int -> IO Int
atomicAddCounter' (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAddIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# (Int#
res# Int# -> Int# -> Int#
+# Int#
x#)) #)
atomicAddCounter :: Counter -> Int -> IO Int
{-# INLINE atomicAddCounter #-}
atomicAddCounter :: Counter -> Int -> IO Int
atomicAddCounter (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAddIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# Int#
res#) #)
atomicAddCounter_ :: Counter -> Int -> IO ()
atomicAddCounter_ :: Counter -> Int -> IO ()
atomicAddCounter_ (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
_ #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAddIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, () #)
{-# INLINE atomicAddCounter_ #-}
atomicSubCounter' :: Counter -> Int -> IO Int
{-# INLINE atomicSubCounter' #-}
atomicSubCounter' :: Counter -> Int -> IO Int
atomicSubCounter' (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchSubIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# (Int#
res# Int# -> Int# -> Int#
-# Int#
x#)) #)
atomicSubCounter :: Counter -> Int -> IO Int
{-# INLINE atomicSubCounter #-}
atomicSubCounter :: Counter -> Int -> IO Int
atomicSubCounter (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchSubIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# Int#
res#) #)
atomicSubCounter_ :: Counter -> Int -> IO ()
atomicSubCounter_ :: Counter -> Int -> IO ()
atomicSubCounter_ (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
_ #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchSubIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, () #)
{-# INLINE atomicSubCounter_ #-}
atomicAndCounter' :: Counter -> Int -> IO Int
atomicAndCounter' :: Counter -> Int -> IO Int
atomicAndCounter' (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAndIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# (Int#
res# Int# -> Int# -> Int#
`andI#` Int#
x#)) #)
{-# INLINE atomicAndCounter' #-}
atomicAndCounter :: Counter -> Int -> IO Int
atomicAndCounter :: Counter -> Int -> IO Int
atomicAndCounter (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAndIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# Int#
res#) #)
{-# INLINE atomicAndCounter #-}
atomicAndCounter_ :: Counter -> Int -> IO ()
atomicAndCounter_ :: Counter -> Int -> IO ()
atomicAndCounter_ (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
_ #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchAndIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, () #)
{-# INLINE atomicAndCounter_ #-}
atomicNandCounter' :: Counter -> Int -> IO Int
atomicNandCounter' :: Counter -> Int -> IO Int
atomicNandCounter' (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchNandIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# (Int# -> Int#
notI# (Int#
res# Int# -> Int# -> Int#
`andI#` Int#
x#))) #)
{-# INLINE atomicNandCounter' #-}
atomicNandCounter :: Counter -> Int -> IO Int
atomicNandCounter :: Counter -> Int -> IO Int
atomicNandCounter (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchNandIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# Int#
res#) #)
{-# INLINE atomicNandCounter #-}
atomicNandCounter_ :: Counter -> Int -> IO ()
atomicNandCounter_ :: Counter -> Int -> IO ()
atomicNandCounter_ (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
_ #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchNandIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, () #)
{-# INLINE atomicNandCounter_ #-}
atomicOrCounter' :: Counter -> Int -> IO Int
atomicOrCounter' :: Counter -> Int -> IO Int
atomicOrCounter' (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchOrIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# (Int#
res# Int# -> Int# -> Int#
`orI#` Int#
x#)) #)
{-# INLINE atomicOrCounter' #-}
atomicOrCounter :: Counter -> Int -> IO Int
atomicOrCounter :: Counter -> Int -> IO Int
atomicOrCounter (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchOrIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# Int#
res#) #)
{-# INLINE atomicOrCounter #-}
atomicOrCounter_ :: Counter -> Int -> IO ()
atomicOrCounter_ :: Counter -> Int -> IO ()
atomicOrCounter_ (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
_ #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchOrIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, () #)
{-# INLINE atomicOrCounter_ #-}
atomicXorCounter' :: Counter -> Int -> IO Int
atomicXorCounter' :: Counter -> Int -> IO Int
atomicXorCounter' (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchXorIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# (Int#
res# Int# -> Int# -> Int#
`xorI#` Int#
x#)) #)
{-# INLINE atomicXorCounter' #-}
atomicXorCounter :: Counter -> Int -> IO Int
atomicXorCounter :: Counter -> Int -> IO Int
atomicXorCounter (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int)
-> (State# RealWorld -> (# State# RealWorld, Int #)) -> IO Int
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
res# #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchXorIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, (Int# -> Int
I# Int#
res#) #)
{-# INLINE atomicXorCounter #-}
atomicXorCounter_ :: Counter -> Int -> IO ()
atomicXorCounter_ :: Counter -> Int -> IO ()
atomicXorCounter_ (PrimRef (MutableByteArray MutableByteArray# RealWorld
mba#)) (I# Int#
x#) = (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a. (State# RealWorld -> (# State# RealWorld, a #)) -> IO a
IO ((State# RealWorld -> (# State# RealWorld, () #)) -> IO ())
-> (State# RealWorld -> (# State# RealWorld, () #)) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ State# RealWorld
s1# ->
let !(# State# RealWorld
s2#, Int#
_ #) = MutableByteArray# RealWorld
-> Int# -> Int# -> State# RealWorld -> (# State# RealWorld, Int# #)
forall d.
MutableByteArray# d
-> Int# -> Int# -> State# d -> (# State# d, Int# #)
fetchXorIntArray# MutableByteArray# RealWorld
mba# Int#
0# Int#
x# State# RealWorld
s1# in (# State# RealWorld
s2#, () #)
{-# INLINE atomicXorCounter_ #-}
newtype UnliftedRef s a = UnliftedRef (MutableUnliftedArray s a)
newUnliftedRef :: (PrimUnlifted a, PrimMonad m) => a -> m (UnliftedRef (PrimState m) a)
newUnliftedRef :: a -> m (UnliftedRef (PrimState m) a)
newUnliftedRef a
x = do
MutableUnliftedArray (PrimState m) a
mba <- Int -> a -> m (MutableUnliftedArray (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, PrimUnlifted a) =>
Int -> a -> m (MutableUnliftedArray (PrimState m) a)
newUnliftedArray Int
1 a
x
UnliftedRef (PrimState m) a -> m (UnliftedRef (PrimState m) a)
forall (m :: * -> *) a. Monad m => a -> m a
return (MutableUnliftedArray (PrimState m) a -> UnliftedRef (PrimState m) a
forall k s (a :: k). MutableUnliftedArray s a -> UnliftedRef s a
UnliftedRef MutableUnliftedArray (PrimState m) a
mba)
{-# INLINE newUnliftedRef #-}
readUnliftedRef :: (PrimUnlifted a, PrimMonad m) => UnliftedRef (PrimState m) a -> m a
readUnliftedRef :: UnliftedRef (PrimState m) a -> m a
readUnliftedRef (UnliftedRef MutableUnliftedArray (PrimState m) a
mba) = MutableUnliftedArray (PrimState m) a -> Int -> m a
forall (m :: * -> *) a.
(PrimMonad m, PrimUnlifted a) =>
MutableUnliftedArray (PrimState m) a -> Int -> m a
readUnliftedArray MutableUnliftedArray (PrimState m) a
mba Int
0
{-# INLINE readUnliftedRef #-}
writeUnliftedRef :: (PrimUnlifted a, PrimMonad m) => UnliftedRef (PrimState m) a -> a -> m ()
writeUnliftedRef :: UnliftedRef (PrimState m) a -> a -> m ()
writeUnliftedRef (UnliftedRef MutableUnliftedArray (PrimState m) a
mba) a
x = MutableUnliftedArray (PrimState m) a -> Int -> a -> m ()
forall (m :: * -> *) a.
(PrimMonad m, PrimUnlifted a) =>
MutableUnliftedArray (PrimState m) a -> Int -> a -> m ()
writeUnliftedArray MutableUnliftedArray (PrimState m) a
mba Int
0 a
x
{-# INLINE writeUnliftedRef #-}
modifyUnliftedRef :: (PrimUnlifted a, PrimMonad m) => UnliftedRef (PrimState m) a -> (a -> a) -> m ()
modifyUnliftedRef :: UnliftedRef (PrimState m) a -> (a -> a) -> m ()
modifyUnliftedRef UnliftedRef (PrimState m) a
ref a -> a
f = UnliftedRef (PrimState m) a -> m a
forall a (m :: * -> *).
(PrimUnlifted a, PrimMonad m) =>
UnliftedRef (PrimState m) a -> m a
readUnliftedRef UnliftedRef (PrimState m) a
ref m a -> (a -> m ()) -> m ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= UnliftedRef (PrimState m) a -> a -> m ()
forall a (m :: * -> *).
(PrimUnlifted a, PrimMonad m) =>
UnliftedRef (PrimState m) a -> a -> m ()
writeUnliftedRef UnliftedRef (PrimState m) a
ref (a -> m ()) -> (a -> a) -> a -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f
{-# INLINE modifyUnliftedRef #-}