module Data.Matrix.Generic.Mutable
( MMatrix(..)
, write
, read
) where
import Prelude hiding (read)
import Control.Monad.Primitive (PrimMonad, PrimState)
import qualified Data.Vector.Generic.Mutable as GM
class GM.MVector v a => MMatrix m v a where
dim :: m v s a -> (Int, Int)
unsafeRead :: PrimMonad s => m v (PrimState s) a -> (Int, Int) -> s a
unsafeWrite :: PrimMonad s => m v (PrimState s) a -> (Int, Int) -> a -> s ()
new :: PrimMonad s => (Int, Int) -> s (m v (PrimState s) a)
replicate :: PrimMonad s => (Int, Int) -> a -> s (m v (PrimState s) a)
write :: (PrimMonad s, MMatrix m v a)
=> m v (PrimState s) a -> (Int, Int) -> a -> s ()
write mat (i,j) | i >= r || j >= c = error "Index out of bounds"
| otherwise = unsafeWrite mat (i,j)
where
(r,c) = dim mat
read :: (PrimMonad s, MMatrix m v a)
=> m v (PrimState s) a -> (Int, Int) -> s a
read mat (i,j) | i >= r || j >= c = error "Index out of bounds"
| otherwise = unsafeRead mat (i,j)
where
(r,c) = dim mat