{-# LANGUAGE GADTs #-} module Numeric.LAPACK.Matrix.ModifierTyped where import qualified Numeric.LAPACK.Matrix.Modifier as Mod import qualified Numeric.LAPACK.Matrix.Extent.Private as Extent import Numeric.LAPACK.Matrix.Extent.Private (Extent, Small) data Transposition heightA widthA heightB widthB where NonTransposed :: Transposition height width height width Transposed :: Transposition height width width height transposeTransposition :: Transposition heightA widthA heightB widthB -> Transposition widthA heightA widthB heightB transposeTransposition trans = case trans of NonTransposed -> NonTransposed Transposed -> Transposed transposeSquareExtent :: (Extent.Measure meas) => Transposition heightA widthA heightB widthB -> Extent meas Small Small heightA widthA -> Extent meas Small Small heightB widthB transposeSquareExtent trans = case trans of NonTransposed -> id Transposed -> Extent.transpose transpositionToUntyped :: Transposition heightA widthA heightB widthB -> Mod.Transposition transpositionToUntyped trans = case trans of NonTransposed -> Mod.NonTransposed Transposed -> Mod.Transposed fromSquareTransposition :: Mod.Transposition -> Transposition sh sh sh sh fromSquareTransposition trans = case trans of Mod.NonTransposed -> NonTransposed Mod.Transposed -> Transposed data SquareTransposition sh height width where SquareTransposition :: Mod.Transposition -> SquareTransposition sh sh sh squareFromTransposition :: Transposition sh sh height width -> SquareTransposition sh height width squareFromTransposition trans = case trans of NonTransposed -> SquareTransposition Mod.NonTransposed Transposed -> SquareTransposition Mod.Transposed