{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Data.Matrix.Static.Sparse.Mutable
(
MSparseMatrix(..)
) where
import Control.DeepSeq
import qualified Data.Vector.Generic.Mutable as GM
import qualified Data.Vector.Storable as S
import Prelude hiding (read, replicate)
import Data.Singletons
import Control.Monad.Primitive (PrimMonad, PrimState)
import qualified Data.Matrix.Static.Generic.Mutable as C
data MSparseMatrix :: C.MMatrixKind where
MSparseMatrix :: (SingI r, SingI c)
=> (v s a)
-> (S.Vector Int)
-> (S.Vector Int)
-> MSparseMatrix r c v s a
instance (NFData (v s a)) => NFData (MSparseMatrix r c v s a) where
rnf (MSparseMatrix vec inner outer) = rnf vec
instance GM.MVector v a => C.MMatrix MSparseMatrix v a where
dim :: forall r c s. MSparseMatrix r c v s a -> (Int, Int)
dim (MSparseMatrix _ _ _) = (r,c)
where
r = fromIntegral $ fromSing (sing :: Sing r)
c = fromIntegral $ fromSing (sing :: Sing c)
{-# INLINE dim #-}