module Control.Concurrent.STM.TArray (
TArray
) where
import Control.Monad (replicateM)
import Data.Array (Array, bounds)
import Data.Array.Base (listArray, arrEleBottom, unsafeAt, MArray(..),
IArray(numElements))
import Data.Ix (rangeSize)
import Control.Concurrent.STM.TVar (TVar, newTVar, readTVar, writeTVar)
#ifdef __GLASGOW_HASKELL__
import GHC.Conc (STM)
#else
import Control.Sequential.STM (STM)
#endif
newtype TArray i e = TArray (Array i (TVar e))
instance MArray TArray e STM where
getBounds (TArray a) = return (bounds a)
newArray b e = do
a <- replicateM (rangeSize b) (newTVar e)
return $ TArray (listArray b a)
newArray_ b = do
a <- replicateM (rangeSize b) (newTVar arrEleBottom)
return $ TArray (listArray b a)
unsafeRead (TArray a) i = readTVar $ unsafeAt a i
unsafeWrite (TArray a) i e = writeTVar (unsafeAt a i) e
getNumElements (TArray a) = return (numElements a)