module Data.PrimitiveArray where
import Control.Monad.Primitive (PrimMonad)
import Data.Array.Repa.Shape (Shape)
import Control.Exception (assert)
class Shape sh => PrimArrayOps sh elm where
data PrimArray sh elm :: *
unsafeIndex :: PrimArray sh elm -> sh -> elm
bounds :: PrimArray sh elm -> (sh,sh)
inBounds :: PrimArray sh elm -> sh -> Bool
fromAssocs :: sh -> sh -> elm -> [(sh,elm)] -> PrimArray sh elm
assocs :: PrimArray sh elm -> [(sh,elm)]
class (PrimMonad m, Shape sh) => PrimArrayOpsM sh elm m where
data PrimArrayM sh elm m :: *
readM :: PrimArrayM sh elm m -> sh -> m elm
writeM :: PrimArrayM sh elm m -> sh -> elm -> m ()
fromAssocsM :: sh -> sh -> elm -> [(sh,elm)] -> m (PrimArrayM sh elm m)
unsafeFreezeM :: PrimArrayM sh elm m -> m (PrimArray sh elm)
boundsM :: PrimArrayM sh elm m -> (sh,sh)
inBoundsM :: PrimArrayM sh elm m -> sh -> Bool
(!) :: PrimArrayOps sh elm => PrimArray sh elm -> sh -> elm
(!) pa idx = assert (inBounds pa idx) $ unsafeIndex pa idx