{-# LANGUAGE Haskell2010
    , TypeFamilies
    , FlexibleContexts
    , Trustworthy
    , StandaloneDeriving
    , DeriveDataTypeable
    , CPP
 #-}
{-# OPTIONS -Wall -fno-warn-name-shadowing #-}

module Numeric.Vector (

    Vector

) where

import Data.Ratio
import Data.Complex
import Data.Int

import Data.Array.IArray
import Data.Array.Unboxed

import Data.Typeable

import qualified Data.Array.Unsafe as U

data family Vector e

#if defined(__GLASGOW_HASKELL__) && (__GLASGOW_HASKELL__ >= 707)
deriving instance Typeable Vector
#else
deriving instance Typeable1 Vector
#endif


data instance Vector Int
    = IntVector !Int (UArray Int Int)

data instance Vector Float
    = FloatVector !Int (UArray Int Float)

data instance Vector Double
    = DoubleVector !Int (UArray Int Double)

data instance Vector Integer
    = IntegerVector !Int (Array Int Integer)

data instance Vector (Ratio a)
    = RatioVector !Int (Array Int (Ratio a))

data instance Vector (Complex a)
    = ComplexVector !Int (Array Int (Complex a))

-- <.>
dotProd = undefined

-- ><
vectorProd = undefined