{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Matrix.Static.Generic.Mutable
( MMatrix(..)
, MMatrixKind
) where
import Control.Monad.Primitive (PrimMonad, PrimState)
import qualified Data.Vector.Generic.Mutable as GM
import Prelude hiding (read)
import Data.Kind (Type)
import GHC.TypeLits (Nat)
import Data.Singletons (SingI)
type MMatrixKind = Nat -> Nat -> (Type -> Type -> Type) -> Type -> Type -> Type
class GM.MVector v a => MMatrix (mat :: MMatrixKind) v a where
dim :: mat r c v s a -> (Int, Int)
unsafeRead :: PrimMonad s => mat r c v (PrimState s) a -> (Int, Int) -> s a
unsafeWrite :: PrimMonad s => mat r c v (PrimState s) a -> (Int, Int) -> a -> s ()
new :: (SingI r, SingI c, PrimMonad s) => s (mat r c v (PrimState s) a)
replicate :: (SingI r, SingI c, PrimMonad s) => a -> s (mat r c v (PrimState s) a)
{-# MINIMAL dim, unsafeRead, unsafeWrite, new, replicate #-}