multilinear-0.2.2: src/Multilinear/Index/Infinite.hs
{-|
Module : Multilinear.Index.Infinite
Description : Infinite-dimensional tensor index.
Copyright : (c) Artur M. Brodzki, 2018
License : BSD3
Maintainer : artur@brodzki.org
Stability : experimental
Portability : Windows/POSIX
Infinite-dimensional tensor index.
-}
module Multilinear.Index.Infinite (
Index(..)
) where
import Control.DeepSeq
import GHC.Generics
import qualified Multilinear.Index as TIndex
{-| Index of infinite-dimensional tensor -}
data Index =
Covariant {
indexName' :: String
} |
Contravariant {
indexName' :: String
} |
Indifferent {
indexName' :: String
}
deriving (Eq, Generic)
{-| Show instance of Infinite index -}
instance Show Index where
show (Covariant n) = "[" ++ n ++ "]"
show (Contravariant n) = "<" ++ n ++ ">"
show (Indifferent n) = "(" ++ n ++ ")"
{-| Infinite index is a Multilinear.Index instance -}
instance TIndex.Index Index where
{-| Index name -}
indexName = indexName'
{-| Return true if index is covariant |-}
isCovariant (Covariant _) = True
isCovariant _ = False
{-| Return true if index is contravariant |-}
isContravariant (Contravariant _) = True
isContravariant _ = False
{-| Return true if index is indifferent |-}
isIndifferent (Indifferent _) = True
isIndifferent _ = False
{-| Returns true if two indices are quivalent, i.e. differs only by name, but share same type. -}
equivI (Covariant _) (Covariant _) = True
equivI (Contravariant _) (Contravariant _) = True
equivI (Indifferent _) (Indifferent _) = True
equivI _ _ = False
{-| Convert to TIndex -}
toTIndex (Covariant name) = TIndex.Covariant Nothing name
toTIndex (Contravariant name) = TIndex.Contravariant Nothing name
toTIndex (Indifferent name) = TIndex.Indifferent Nothing name
-- NFData instance
instance NFData Index