{-# 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