packages feed

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

module Data.Array.IOArray(
  IOArray(..),
  newIOArray,
  boundsIOArray,
  numElementsIOArray,
  readIOArray,
  writeIOArray,
  freezeIOArray,
  thawIOArray,
  unsafeReadIOArray,
  unsafeWriteIOArray,
  unsafeFreezeIOArray,
  unsafeThawIOArray,
  ) where
import Control.Monad.ST
import Control.Monad.ST_Type
import Data.Ix
import Mhs.Array
import Mhs.MutArr

data IOArray i a
   = IOArray (i, i)          -- bounds
             !Int            -- = rangeSize (l, u)
             (MutIOArr a)    -- elements

newIOArray :: Ix i => (i,i) -> e -> IO (IOArray i e)
newIOArray lu a = IOArray lu n <$> newMutIOArr n a
  where n = safeRangeSize lu

boundsIOArray :: IOArray i e -> (i,i)
boundsIOArray (IOArray lu _ _) = lu

numElementsIOArray :: IOArray i e -> Int
numElementsIOArray (IOArray _ n _) = n

readIOArray :: Ix i => IOArray i e -> i -> IO e
readIOArray arr@(IOArray lu n _) i = unsafeReadIOArray arr (safeIndex lu n i)

unsafeReadIOArray :: IOArray i e -> Int -> IO e
unsafeReadIOArray (IOArray _ _ arr) i = unsafeReadMutIOArr arr i

writeIOArray :: Ix i => IOArray i e -> i -> e -> IO ()
writeIOArray arr@(IOArray lu n _) i e = unsafeWriteIOArray arr (safeIndex lu n i) e

unsafeWriteIOArray :: IOArray i e -> Int -> e -> IO ()
unsafeWriteIOArray (IOArray _ _ arr) i e = unsafeWriteMutIOArr arr i e

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

freezeIOArray :: IOArray i e -> IO (Array i e)
freezeIOArray (IOArray lu n arr) = Array lu n <$> copyMutIOArr arr

unsafeFreezeIOArray :: IOArray i e -> IO (Array i e)
unsafeFreezeIOArray (IOArray lu n arr) = return $ Array lu n arr

thawIOArray :: Array i e -> IO (IOArray i e)
thawIOArray (Array lu n arr) = IOArray lu n <$> copyMutIOArr arr

unsafeThawIOArray :: Array i e -> IO (IOArray i e)
unsafeThawIOArray (Array lu n arr) = return $ IOArray lu n arr