{-# language GADTs, TypeOperators #-}
module Data.Dim where

import Data.Vector.Unboxed as V


-- * Dimension metadata

-- | To define a /dense/ dimension we only need the dimensionality parameter
newtype Dd i = Dd { dDim :: i } deriving (Eq, Show)


-- | To define a /sparse/ dimension we need a cumulative array, an index array and a dimensionality parameter
data Sd i = Sd {
      sCml :: Maybe (V.Vector i)
    , sIdx :: V.Vector i
    , sDim :: i }
  deriving (Eq, Show)

-- | A tensor dimension can be either dense or sparse.
--
-- Example: the CSR format is /dense/ in the first index (rows) and /sparse/ in the second index (columns)

-- newtype DMD i = DMD (Either (DMDDense i) (DMDSparse i)) deriving (Eq, Show)