module Data.Vector.Mutable ( MVector(..), IOVector, STVector )
where
import qualified Data.Vector.Generic.Mutable as G
import Data.Primitive.Array
import Control.Monad.Primitive ( PrimMonad )
import Control.Monad.ST ( ST )
data MVector m a = MVector !Int
!Int
!(MutableArray m a)
type IOVector = MVector IO
type STVector s = MVector (ST s)
instance G.MVectorPure (MVector m) a where
length (MVector _ n _) = n
unsafeSlice (MVector i _ arr) j m = MVector (i+j) m arr
overlaps (MVector i m arr1) (MVector j n arr2)
= sameMutableArray arr1 arr2
&& (between i j (j+n) || between j i (i+m))
where
between x y z = x >= y && x < z
instance PrimMonad m => G.MVector (MVector m) m a where
unsafeNew n = do
arr <- newArray n uninitialised
return (MVector 0 n arr)
unsafeNewWith n x = do
arr <- newArray n x
return (MVector 0 n arr)
unsafeRead (MVector i _ arr) j = readArray arr (i+j)
unsafeWrite (MVector i _ arr) j x = writeArray arr (i+j) x
clear v = G.set v uninitialised
uninitialised :: a
uninitialised = error "Data.Vector.Mutable: uninitialised element"