module Data.STRef.Unboxed
(
STRefU(..)
, newSTRefU
, readSTRefU
, writeSTRefU
, modifySTRefU
) where
import Control.Monad.ST
import Data.Coerce
import Data.Vector.Unboxed.Mutable (MVector, Unbox)
import qualified Data.Vector.Unboxed.Mutable as Unboxed
newtype STRefU s a = STRefU {getSTRefU :: MVector s a}
newSTRefU :: (Unbox a) => a -> ST s (STRefU s a)
newSTRefU a =
do
mv <- Unboxed.unsafeNew 1
Unboxed.write mv 0 a
pure (coerce mv)
readSTRefU :: (Unbox a) => STRefU s a -> ST s a
readSTRefU (STRefU mv) = Unboxed.read mv 0
writeSTRefU :: (Unbox a) => STRefU s a -> a -> ST s ()
writeSTRefU (STRefU mv) = Unboxed.write mv 0
modifySTRefU :: (Unbox a) => STRefU s a -> (a -> a) -> ST s ()
modifySTRefU (STRefU mv) f = Unboxed.modify mv f 0