module Numeric.LAPACK.Matrix.Modifier where import Numeric.LAPACK.Matrix.Shape.Private (Order(RowMajor,ColumnMajor), flipOrder) import Data.Monoid (Monoid, mempty, mappend) import Data.Semigroup (Semigroup, (<>)) data Transposition = NonTransposed | Transposed deriving (Eq, Show, Enum, Bounded) instance Semigroup Transposition where x<>y = if x==y then NonTransposed else Transposed instance Monoid Transposition where mempty = NonTransposed mappend = (<>) transposeOrder :: Transposition -> Order -> Order transposeOrder NonTransposed = id transposeOrder Transposed = flipOrder data Conjugation = NonConjugated | Conjugated deriving (Eq, Show, Enum, Bounded) instance Semigroup Conjugation where x<>y = if x==y then NonConjugated else Conjugated instance Monoid Conjugation where mempty = NonConjugated mappend = (<>) conjugatedOnRowMajor :: Order -> Conjugation conjugatedOnRowMajor RowMajor = Conjugated conjugatedOnRowMajor ColumnMajor = NonConjugated data Inversion = NonInverted | Inverted deriving (Eq, Show, Enum, Bounded) instance Semigroup Inversion where x<>y = if x==y then NonInverted else Inverted instance Monoid Inversion where mempty = NonInverted mappend = (<>)