packages feed

array-mhs-0.5.8.0: Data/Array/STArray.hs

module Data.Array.STArray(
  STArray(..),
  newSTArray,
  boundsSTArray,
  numElementsSTArray,
  readSTArray,
  writeSTArray,
  freezeSTArray,
  thawSTArray,
  unsafeReadSTArray,
  unsafeWriteSTArray,
  unsafeFreezeSTArray,
  unsafeThawSTArray,
  ) where
import Control.Monad.ST
import Control.Monad.ST_Type
import Mhs.Array
import Data.Array.IOArray

newtype STArray s i a = STArray (IOArray i a)

newSTArray :: Ix i => (i,i) -> e -> ST s (STArray s i e)
newSTArray lu e = ST (STArray <$> newIOArray lu e)

boundsSTArray :: STArray s i e -> (i,i)
boundsSTArray (STArray a) = boundsIOArray a

numElementsSTArray :: forall s i e . STArray s i e -> Int
numElementsSTArray (STArray a) = numElementsIOArray a

readSTArray :: Ix i => STArray s i e -> i -> ST s e
readSTArray (STArray a) i = ST (readIOArray a i)

unsafeReadSTArray :: STArray s i e -> Int -> ST s e
unsafeReadSTArray (STArray a) i = ST (unsafeReadIOArray a i)

writeSTArray :: Ix i => STArray s i e -> i -> e -> ST s ()
writeSTArray (STArray a) i e = ST (writeIOArray a i e)

unsafeWriteSTArray :: STArray s i e -> Int -> e -> ST s ()
unsafeWriteSTArray (STArray a) i e = ST (unsafeWriteIOArray a i e)

----------------------------------------------------------------------
-- Moving between mutable and immutable

freezeSTArray :: STArray s i e -> ST s (Array i e)
freezeSTArray (STArray a) = ST (freezeIOArray a)

unsafeFreezeSTArray :: STArray s i e -> ST s (Array i e)
unsafeFreezeSTArray (STArray a) = ST (unsafeFreezeIOArray a)

thawSTArray :: Array i e -> ST s (STArray s i e)
thawSTArray a = ST (STArray <$> thawIOArray a)

unsafeThawSTArray :: Array i e -> ST s (STArray s i e)
unsafeThawSTArray a = ST (STArray <$> unsafeThawIOArray a)