module Numeric.LAPACK.Vector.Private where

import qualified Numeric.LAPACK.Shape.Private as ShapePriv

import qualified Numeric.LAPACK.FFI.Complex as LapackComplex
import qualified Numeric.BLAS.FFI.Generic as BlasGen
import qualified Numeric.Netlib.Class as Class

import Foreign.Ptr (Ptr)
import Foreign.C.Types (CInt)

import qualified Data.Array.Comfort.Storable.Unchecked as Array
import Data.Array.Comfort.Storable.Unchecked (Array)


newtype ArgMaximum a =
   ArgMaximum {runArgMaximum :: Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt}

absMax :: Class.Floating a => Ptr CInt -> Ptr a -> Ptr CInt -> IO CInt
absMax =
   runArgMaximum $
   Class.switchFloating
      (ArgMaximum BlasGen.iamax)
      (ArgMaximum BlasGen.iamax)
      (ArgMaximum LapackComplex.imax1)
      (ArgMaximum LapackComplex.imax1)


uncheck :: Array sh a -> Array (ShapePriv.Unchecked sh) a
uncheck = Array.mapShape ShapePriv.Unchecked

recheck :: Array (ShapePriv.Unchecked sh) a -> Array sh a
recheck = Array.mapShape ShapePriv.deconsUnchecked