{-# LANGUAGE RankNTypes #-}
{-# OPTIONS_GHC -Wall #-}
module Data.Primitive.Indexed.PrimArray
(
PrimVector
, MutablePrimVector
, new
, index
, read
, write
, length
, size
, unsafeFreeze
, forget
, with
) where
import Prelude hiding (read,length,zipWith,reverse)
import Control.Monad.Primitive (PrimMonad,PrimState)
import Data.Primitive.Types (Prim)
import Data.Primitive.PrimArray
import Data.Primitive.Indexed.Unsafe (PrimVector(..),MutablePrimVector(..),Index(..),Length(..))
new :: (PrimMonad m, Prim a) => Length n -> m (MutablePrimVector n (PrimState m) a)
{-# INLINE new #-}
new (Length n) = fmap MutablePrimVector (newPrimArray n)
index :: Prim a => PrimVector n a -> Index n -> a
{-# INLINE index #-}
index (PrimVector arr) (Index i) = indexPrimArray arr i
read :: (PrimMonad m, Prim a) => MutablePrimVector n (PrimState m) a -> Index n -> m a
{-# INLINE read #-}
read (MutablePrimVector marr) (Index i) = readPrimArray marr i
write :: (PrimMonad m, Prim a) => MutablePrimVector n (PrimState m) a -> Index n -> a -> m ()
{-# INLINE write #-}
write (MutablePrimVector marr) (Index i) a = writePrimArray marr i a
length :: Prim a => PrimVector n a -> Length n
{-# INLINE length #-}
length (PrimVector arr) = Length (sizeofPrimArray arr)
size :: Prim a => MutablePrimVector n s a -> Length n
{-# INLINE size #-}
size (MutablePrimVector marr) = Length (sizeofMutablePrimArray marr)
with :: PrimArray a -> (forall n. PrimVector n a -> b) -> b
{-# INLINE with #-}
with arr f = f (PrimVector arr)
forget :: PrimVector n a -> PrimArray a
{-# INLINE forget #-}
forget (PrimVector arr) = arr
unsafeFreeze :: PrimMonad m => MutablePrimVector n (PrimState m) a -> m (PrimVector n a)
{-# INLINE unsafeFreeze #-}
unsafeFreeze (MutablePrimVector marr) = fmap PrimVector (unsafeFreezePrimArray marr)