module Data.Atomics.Vector ( casVectorElem, unsafeCasVectorElem , readVectorElem, unsafeReadVectorElem ) where import Data.Atomics import Data.Vector.Mutable {-# INLINE casVectorElem #-} -- | Perform a compare-and-swap on a single element of a mutable vector. casVectorElem :: IOVector a -> Int -> Ticket a -> a -> IO (Bool, Ticket a) casVectorElem (MVector st len array) i tick elm = let idx = i + st in if i >= len then error $ "casVectorElem: out of bounds access to index "++show i++ " of IOVector of length "++show len else casArrayElem array idx tick elm {-# INLINE unsafeCasVectorElem #-} -- | Unsafe version of `casVectorElem` which is not bounds checked. unsafeCasVectorElem :: IOVector a -> Int -> Ticket a -> a -> IO (Bool, Ticket a) unsafeCasVectorElem (MVector st _ array) i tick elm = let idx = i + st in casArrayElem array idx tick elm {-# INLINE readVectorElem #-} readVectorElem :: IOVector a -> Int -> IO (Ticket a) readVectorElem (MVector st len arr) ix = if ix >= len then error $ "readVectorElem: out of bounds access to index "++show ix++ " of IOVector of length "++show len else readArrayElem arr (st + ix) {-# INLINE unsafeReadVectorElem #-} unsafeReadVectorElem :: IOVector a -> Int -> IO (Ticket a) unsafeReadVectorElem (MVector st _ arr) ix = readArrayElem arr (st + ix)