diff --git a/comfort-blas.cabal b/comfort-blas.cabal
--- a/comfort-blas.cabal
+++ b/comfort-blas.cabal
@@ -1,6 +1,6 @@
 Cabal-Version:    2.2
 Name:             comfort-blas
-Version:          0.0.0.1
+Version:          0.0.1
 License:          BSD-3-Clause
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -17,7 +17,7 @@
   Makefile
 
 Source-Repository this
-  Tag:         0.0.0.1
+  Tag:         0.0.1
   Type:        darcs
   Location:    https://hub.darcs.net/thielema/comfort-blas/
 
@@ -31,8 +31,9 @@
     netlib-ffi >=0.1.1 && <0.2,
     comfort-array >=0.5.2 && <0.6,
     guarded-allocation >=0.0 && <0.1,
-    containers >=0.4 && <0.7,
-    deepseq >=1.3 && <1.5,
+    containers >=0.4 && <0.8,
+    semigroups >=0.19 && <0.21,
+    deepseq >=1.3 && <1.6,
     transformers >=0.4 && <0.7,
     utility-ht >=0.0.13 && <0.1,
     base >=4.5 && <5
@@ -56,7 +57,7 @@
   Build-Depends:
     comfort-blas,
     netlib-ffi,
-    comfort-array,
+    comfort-array >=0.5.3,
     doctest-exitcode-stdio >=0.0 && <0.1,
     doctest-lib >=0.1 && <0.2,
     QuickCheck >=2.5 && <3,
diff --git a/src/Numeric/BLAS/Vector.hs b/src/Numeric/BLAS/Vector.hs
--- a/src/Numeric/BLAS/Vector.hs
+++ b/src/Numeric/BLAS/Vector.hs
@@ -11,6 +11,8 @@
    CheckedArray.take, CheckedArray.drop,
    CheckedArray.takeLeft, CheckedArray.takeRight,
    swap,
+   reverse,
+   cyclicReverse,
    CheckedArray.singleton,
    constant,
    zero,
@@ -65,7 +67,7 @@
 import Foreign.Marshal.Array (advancePtr)
 import Foreign.ForeignPtr (withForeignPtr, castForeignPtr)
 import Foreign.Ptr (Ptr)
-import Foreign.Storable (Storable, peek, peekElemOff, pokeElemOff)
+import Foreign.Storable (Storable, peek, peekElemOff, poke, pokeElemOff)
 import Foreign.C.Types (CInt)
 
 import System.IO.Unsafe (unsafePerformIO)
@@ -73,8 +75,8 @@
 import Control.Monad.Trans.Cont (ContT(ContT), evalContT)
 import Control.Monad.IO.Class (liftIO)
 import Control.Monad.ST (runST)
-import Control.Monad (fmap, return, (=<<))
-import Control.Applicative (liftA3, (<$>))
+import Control.Monad (when, fmap, return, (=<<))
+import Control.Applicative (liftA3, (<$>), (*>))
 
 import qualified Data.Array.Comfort.Storable.Mutable.Unchecked as UMutArray
 import qualified Data.Array.Comfort.Storable.Mutable as MutArray
@@ -89,15 +91,16 @@
 import Data.Maybe (Maybe(Nothing,Just), maybe)
 import Data.Tuple.HT (mapFst, uncurry3)
 import Data.Tuple (fst, snd)
-import Data.Ord ((>=))
+import Data.Ord ((>=), (>))
 import Data.Eq (Eq, (==))
 
-import Prelude (Int, fromIntegral, (-), Char, error, IO)
+import Prelude (Int, Integral, fromIntegral, (-), Char, error, IO)
 
 
 {- $setup
 >>> import Test.NumberModule.Type (Number_)
 >>> import Test.Generator (genNumber)
+>>> import Test.Slice (shapeInt)
 >>> import Test.Utility (approx)
 >>> import qualified Numeric.BLAS.Vector as Vector
 >>> import qualified Numeric.Netlib.Class as Class
@@ -108,6 +111,8 @@
 >>> import Numeric.BLAS.Scalar (RealOf, absolute, minusOne)
 >>> import Data.Array.Comfort.Storable (Array, (!))
 >>> import Data.Complex (Complex((:+)))
+>>> import Data.Monoid ((<>))
+>>> import Data.Tuple.HT (mapPair)
 >>> import Control.Applicative (liftA2)
 >>> import Control.Monad (replicateM)
 >>>
@@ -124,45 +129,67 @@
 >>> maxDim :: Int
 >>> maxDim = 100
 >>>
->>> genVector :: (Class.Floating a) => Integer -> Int -> QC.Gen (Vector a)
->>> genVector maxE dim =
->>>    fmap (Vector.fromList (Shape.ZeroBased dim)) $
->>>    replicateM dim $ genNumber maxE
+>>> genVector ::
+>>>    (Shape.C sh, Class.Floating a) =>
+>>>    sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
+>>> genVector shape genElem =
+>>>    fmap (Vector.fromList shape) $
+>>>    replicateM (Shape.size shape) genElem
 >>>
+>>> real_ :: QC.Gen Real_
+>>> real_ = genNumber maxElem
+>>>
+>>> complex_ :: QC.Gen Complex_
+>>> complex_ = genNumber maxElem
+>>>
+>>> number_ :: QC.Gen Number_
+>>> number_ = genNumber maxElem
+>>>
 >>> isNonEmpty :: Shape.C sh => Array sh a -> Bool
 >>> isNonEmpty xs = Shape.size (Array.shape xs) > 0
 >>>
->>> newtype ArbRealVector = ArbRealVector (Vector Real_)
->>>    deriving (Show)
+>>> forVector ::
+>>>    (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+>>>    QC.Gen a -> (Vector a -> prop) -> QC.Property
+>>> forVector genElem =
+>>>    QC.forAllShrink
+>>>       (flip genVector genElem . shapeInt =<< QC.choose (0,maxDim))
+>>>       (map Vector.autoFromList . QC.shrink . Vector.toList)
 >>>
->>> instance QC.Arbitrary ArbRealVector where
->>>    arbitrary = do
->>>       dim <- QC.choose (0,maxDim)
->>>       fmap ArbRealVector $ genVector maxElem dim
->>>    shrink (ArbRealVector xs) =
->>>       map (ArbRealVector . Vector.autoFromList) .
->>>       QC.shrink . Vector.toList $ xs
+>>> forVector2 ::
+>>>    (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+>>>    QC.Gen a -> (Vector a -> Vector a -> prop) -> QC.Property
+>>> forVector2 genElem prop =
+>>>    QC.forAllShrink
+>>>       (do shape <- fmap shapeInt $ QC.choose (0,maxDim)
+>>>           liftA2 (,) (genVector shape genElem) (genVector shape genElem))
+>>>       (map (mapPair (Vector.autoFromList, Vector.autoFromList) . unzip) .
+>>>        QC.shrink .
+>>>        uncurry zip . mapPair (Vector.toList, Vector.toList))
+>>>       (uncurry prop)
 >>>
->>> newtype ArbVector = ArbVector (Vector Number_)
->>>    deriving (Show)
+>>> type CyclicVector = Vector.Vector (Shape.Cyclic Int)
 >>>
->>> instance QC.Arbitrary ArbVector where
->>>    arbitrary = do
->>>       dim <- QC.choose (0,maxDim)
->>>       fmap ArbVector $ genVector maxElem dim
->>>    shrink (ArbVector xs) =
->>>       map (ArbVector . Vector.autoFromList) .
->>>       QC.shrink . Vector.toList $ xs
+>>> genCyclicVector ::
+>>>    (Class.Floating a) =>
+>>>    Integer -> Int -> QC.Gen (CyclicVector a)
+>>> genCyclicVector maxE dim =
+>>>    fmap (Vector.fromList (Shape.Cyclic dim)) $
+>>>    replicateM dim $ genNumber maxE
 >>>
->>> data ArbVector2 =
->>>       ArbVector2 (Vector Number_) (Vector Number_)
->>>    deriving (Show)
+>>> cyclicVectorFromListGen :: (Class.Floating a) => [a] -> CyclicVector a
+>>> cyclicVectorFromListGen xs = Vector.fromList (Shape.Cyclic $ length xs) xs
 >>>
->>> instance QC.Arbitrary ArbVector2 where
->>>    arbitrary = do
->>>       dim <- QC.choose (0,maxDim)
->>>       liftA2 ArbVector2
->>>          (genVector maxElem dim) (genVector maxElem dim)
+>>> cyclicVectorFromList :: [Number_] -> CyclicVector Number_
+>>> cyclicVectorFromList = cyclicVectorFromListGen
+>>>
+>>> forCyclicVector ::
+>>>    (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+>>>    QC.Gen a -> (CyclicVector a -> prop) -> QC.Property
+>>> forCyclicVector genElem =
+>>>    QC.forAllShrink
+>>>       (flip genVector genElem . Shape.Cyclic =<< QC.choose (0,maxDim))
+>>>       (map cyclicVectorFromListGen . QC.shrink . Vector.toList)
 -}
 
 
@@ -209,7 +236,7 @@
 
 
 {- |
-prop> \(ArbVector xs) (ArbVector ys) (ArbVector zs) -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
+prop> forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs))
 -}
 (+++) ::
    (Shape.C shx, Shape.C shy, Storable a) =>
@@ -218,6 +245,49 @@
 
 
 {- |
+prop> Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_)
+prop> Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_)
+prop> Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_)
+
+prop> forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs)
+prop> forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs)
+prop> forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs
+-}
+reverse ::
+   (Integral n, Class.Floating a) =>
+   Vector (Shape.ZeroBased n) a -> Vector (Shape.ZeroBased n) a
+reverse (Array sh x) =
+   Array.unsafeCreateWithSize sh $ \n yPtr -> evalContT $ do
+      nPtr <- Call.cint n
+      xPtr <- ContT $ withForeignPtr x
+      incxPtr <- Call.cint 1
+      incyPtr <- Call.cint (-1)
+      liftIO $ Blas.copy nPtr xPtr incxPtr yPtr incyPtr
+
+
+{- |
+prop> cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList [])
+prop> cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1])
+prop> cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3])
+prop> cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6])
+
+prop> forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs)
+-}
+cyclicReverse ::
+   (Integral n, Class.Floating a) =>
+   Vector (Shape.Cyclic n) a -> Vector (Shape.Cyclic n) a
+cyclicReverse (Array sh x) =
+   Array.unsafeCreateWithSize sh $ \n yPtr -> evalContT $ when (n>0) $ do
+      nPtr <- Call.cint (n-1)
+      xPtr <- ContT $ withForeignPtr x
+      incxPtr <- Call.cint 1
+      incyPtr <- Call.cint (-1)
+      liftIO $ do
+         poke yPtr =<< peek xPtr
+         Blas.copy nPtr (advancePtr xPtr 1) incxPtr (advancePtr yPtr 1) incyPtr
+
+
+{- |
 prop> QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_)
 -}
 swap ::
@@ -253,7 +323,7 @@
       (Dot $ dotComplex 'T')
 
 {- |
-prop> \(ArbVector2 xs ys) -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
+prop> forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys
 -}
 inner ::
    (Shape.C sh, Eq sh, Class.Floating a) =>
@@ -306,7 +376,7 @@
       liftIO $ peek zPtr
 
 {- |
-prop> \(ArbVector xs) -> Vector.sum xs == List.sum (Vector.toList xs)
+prop> forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs)
 -}
 sum :: (Shape.C sh, Class.Floating a) => Vector sh a -> a
 sum (Array sh x) = unsafePerformIO $
@@ -366,7 +436,7 @@
 
 
 {- |
-prop> \(ArbVector xs) -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
+prop> forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs))
 -}
 normInf :: (Shape.C sh, Class.Floating a) => Vector sh a -> RealOf a
 normInf arr = unsafePerformIO $
@@ -393,9 +463,9 @@
 >>> Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
 (3,6.0 :+ 0.0)
 
-prop> \(ArbVector xs) -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
-prop> \(ArbVector xs) -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
-prop> \(ArbVector xs, ArbVector ys) -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
+prop> forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm
+prop> forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs
+prop> forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym
 -}
 argAbsMaximum ::
    (Shape.InvIndexed sh, Class.Floating a) =>
@@ -442,7 +512,7 @@
 >>> Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_]
 (1,3.0 :+ 4.0)
 
-prop> \(ArbRealVector xs) -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
+prop> forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs
 -}
 argAbs1Maximum ::
    (Shape.InvIndexed sh, Class.Floating a) =>
@@ -475,7 +545,7 @@
 
 
 {- |
-prop> QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector 3 dim) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
+prop> QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_)))
 -}
 product :: (Shape.C sh, Class.Floating a) => Vector sh a -> a
 product (Array sh x) = unsafePerformIO $
@@ -485,9 +555,9 @@
 {- |
 For restrictions see 'limits'.
 
-prop> \(ArbRealVector xs) -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
-prop> \(ArbRealVector xs) -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
-prop> \(ArbRealVector xs) -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
+prop> forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs)
+prop> forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs)
+prop> forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs)
 -}
 minimum, maximum :: (Shape.C sh, Class.Real a) => Vector sh a -> a
 minimum = fst . limits
@@ -503,7 +573,7 @@
 argMaximum = snd . argLimits
 
 {- |
-prop> \(ArbRealVector xs) -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
+prop> forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs
 
 In contrast to 'Array.limits'
 this implementation is based on fast BLAS functions.
@@ -533,8 +603,8 @@
 
 
 {- |
-prop> \(ArbVector xs) -> Vector.negate xs == Vector.scale minusOne xs
-prop> \(ArbVector xs) -> Vector.scale 2 xs == xs |+| xs
+prop> forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs
+prop> forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs
 -}
 scale, _scale, (.*|) ::
    (Shape.C sh, Class.Floating a) =>
@@ -603,8 +673,8 @@
 
 
 {- |
-prop> \(ArbVector2 xs ys) -> xs |+| ys == ys |+| xs
-prop> \(ArbVector2 xs ys) -> xs == xs |-| ys |+| ys
+prop> forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs
+prop> forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys
 -}
 add, sub, (|+|), (|-|) ::
    (Shape.C sh, Eq sh, Class.Floating a) =>
@@ -634,7 +704,7 @@
 
 
 {- |
-prop> \(ArbVector xs) -> xs == Vector.negate (Vector.negate xs)
+prop> forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs)
 -}
 negate :: (Shape.C sh, Class.Floating a) => Vector sh a -> Vector sh a
 negate =
@@ -647,7 +717,7 @@
 
 
 {- |
-prop> QC.forAll (genNumber maxElem) $ \d (ArbVector xs) -> xs == Vector.raise (-d) (Vector.raise d xs)
+prop> QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs)
 -}
 raise :: (Shape.C sh, Class.Floating a) => a -> Vector sh a -> Vector sh a
 raise c (Array shX x) =
@@ -664,7 +734,7 @@
 
 
 {- |
-prop> \(ArbVector2 xs ys) -> Vector.mul xs ys == Vector.mul ys xs
+prop> forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs
 -}
 mul ::
    (Shape.C sh, Eq sh, Class.Floating a) =>
@@ -672,7 +742,7 @@
 mul = mulConjugation NonConjugated
 
 {- |
-prop> \(ArbVector2 xs ys) -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
+prop> forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys
 -}
 mulConj ::
    (Shape.C sh, Eq sh, Class.Floating a) =>
diff --git a/src/Numeric/BLAS/Vector/Slice.hs b/src/Numeric/BLAS/Vector/Slice.hs
--- a/src/Numeric/BLAS/Vector/Slice.hs
+++ b/src/Numeric/BLAS/Vector/Slice.hs
@@ -88,6 +88,8 @@
 >>> :set -XTypeOperators
 >>> :set -XGADTs
 >>> import qualified Test.Slice as TestSlice
+>>> import Test.NumberModule.Numeric.BLAS.Vector
+>>>    (maxElem, maxDim, genVector, number_, real_, complex_)
 >>> import Test.NumberModule.Type (Number_)
 >>> import Test.Generator (genNumber)
 >>> import Test.Utility (approx, approxReal)
@@ -106,7 +108,6 @@
 >>> import Data.Array.Comfort.Shape ((::+)((::+)))
 >>> import Data.Tuple.HT (mapPair)
 >>> import Data.Complex (Complex)
->>> import Control.Monad (replicateM)
 >>> import Control.Applicative (liftA2)
 >>>
 >>> import qualified Test.QuickCheck as QC
@@ -115,12 +116,6 @@
 >>> type Real_ = RealOf Number_
 >>> type Complex_ = Complex Real_
 >>>
->>> maxElem :: Integer
->>> maxElem = 10
->>>
->>> maxDim :: Int
->>> maxDim = 100
->>>
 >>> maxDim1 :: Int
 >>> maxDim1 = 10
 >>>
@@ -142,24 +137,8 @@
 >>> genShape :: QC.Gen Shape
 >>> genShape = genShapeDim =<< QC.choose (0,maxDim1)
 >>>
->>> genVector ::
->>>    (Shape.C sh, Class.Floating a) =>
->>>    sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
->>> genVector shape genElem =
->>>    fmap (Vector.fromList shape) $
->>>    replicateM (Shape.size shape) genElem
->>>
 >>> forAll_ :: (Show a) => QC.Gen a -> (a -> QC.Property) -> QC.Property
 >>> forAll_ = QC.forAll
->>>
->>> real_ :: QC.Gen Real_
->>> real_ = genNumber maxElem
->>>
->>> complex_ :: QC.Gen Complex_
->>> complex_ = genNumber maxElem
->>>
->>> number_ :: QC.Gen Number_
->>> number_ = genNumber maxElem
 >>>
 >>> isNonEmpty :: Shape.C sh => VectorSlice.T shA sh a -> Bool
 >>> isNonEmpty xs = Shape.size (VectorSlice.shape xs) > 0
diff --git a/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs b/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs
--- a/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs
+++ b/test/Test/ComplexDouble/Numeric/BLAS/Vector.hs
@@ -1,14 +1,15 @@
 -- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Vector.hs
-{-# LINE 98 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 100 "src/Numeric/BLAS/Vector.hs" #-}
 
 module Test.ComplexDouble.Numeric.BLAS.Vector where
 
 import Test.DocTest.Base
 import qualified Test.DocTest.Driver as DocTest
 
-{-# LINE 99 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 101 "src/Numeric/BLAS/Vector.hs" #-}
 import     Test.ComplexDouble.Type (Number_)
 import     Test.Generator (genNumber)
+import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
@@ -19,6 +20,8 @@
 import     Numeric.BLAS.Scalar (RealOf, absolute, minusOne)
 import     Data.Array.Comfort.Storable (Array, (!))
 import     Data.Complex (Complex((:+)))
+import     Data.Monoid ((<>))
+import     Data.Tuple.HT (mapPair)
 import     Control.Applicative (liftA2)
 import     Control.Monad (replicateM)
 
@@ -35,167 +38,244 @@
 maxDim     :: Int
 maxDim     = 100
 
-genVector     :: (Class.Floating a) => Integer -> Int -> QC.Gen (Vector a)
-genVector     maxE dim =
-       fmap (Vector.fromList (Shape.ZeroBased dim)) $
-       replicateM dim $ genNumber maxE
+genVector     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
+genVector     shape genElem =
+       fmap (Vector.fromList shape) $
+       replicateM (Shape.size shape) genElem
 
+real_     :: QC.Gen Real_
+real_     = genNumber maxElem
+
+complex_     :: QC.Gen Complex_
+complex_     = genNumber maxElem
+
+number_     :: QC.Gen Number_
+number_     = genNumber maxElem
+
 isNonEmpty     :: Shape.C sh => Array sh a -> Bool
 isNonEmpty     xs = Shape.size (Array.shape xs) > 0
 
-newtype     ArbRealVector = ArbRealVector (Vector Real_)
-       deriving (Show)
+forVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> prop) -> QC.Property
+forVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . shapeInt =<< QC.choose (0,maxDim))
+          (map Vector.autoFromList . QC.shrink . Vector.toList)
 
-instance     QC.Arbitrary ArbRealVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbRealVector $ genVector maxElem dim
-       shrink (ArbRealVector xs) =
-          map (ArbRealVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+forVector2     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> Vector a -> prop) -> QC.Property
+forVector2     genElem prop =
+       QC.forAllShrink
+          (do shape <- fmap shapeInt $ QC.choose (0,maxDim)
+              liftA2 (,) (genVector shape genElem) (genVector shape genElem))
+          (map (mapPair (Vector.autoFromList, Vector.autoFromList) . unzip) .
+           QC.shrink .
+           uncurry zip . mapPair (Vector.toList, Vector.toList))
+          (uncurry prop)
 
-newtype     ArbVector = ArbVector (Vector Number_)
-       deriving (Show)
+type     CyclicVector = Vector.Vector (Shape.Cyclic Int)
 
-instance     QC.Arbitrary ArbVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbVector $ genVector maxElem dim
-       shrink (ArbVector xs) =
-          map (ArbVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+genCyclicVector     ::
+       (Class.Floating a) =>
+       Integer -> Int -> QC.Gen (CyclicVector a)
+genCyclicVector     maxE dim =
+       fmap (Vector.fromList (Shape.Cyclic dim)) $
+       replicateM dim $ genNumber maxE
 
-data     ArbVector2 =
-          ArbVector2 (Vector Number_) (Vector Number_)
-       deriving (Show)
+cyclicVectorFromListGen     :: (Class.Floating a) => [a] -> CyclicVector a
+cyclicVectorFromListGen     xs = Vector.fromList (Shape.Cyclic $ length xs) xs
 
-instance     QC.Arbitrary ArbVector2 where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          liftA2 ArbVector2
-             (genVector maxElem dim) (genVector maxElem dim)
+cyclicVectorFromList     :: [Number_] -> CyclicVector Number_
+cyclicVectorFromList     = cyclicVectorFromListGen
 
+forCyclicVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (CyclicVector a -> prop) -> QC.Property
+forCyclicVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . Shape.Cyclic =<< QC.choose (0,maxDim))
+          (map cyclicVectorFromListGen . QC.shrink . Vector.toList)
+
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:212: "
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:239: "
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) (ArbVector ys) (ArbVector zs) -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:221: "
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:248: "
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:249: "
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:250: "
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:252: "
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:253: "
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:254: "
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:269: "
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList []))
+ DocTest.printPrefix "Numeric.BLAS.Vector:270: "
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:271: "
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:272: "
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+     (forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:291: "
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
      (QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_))
- DocTest.printPrefix "Numeric.BLAS.Vector:256: "
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:326: "
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:309: "
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:379: "
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.sum xs == List.sum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:369: "
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:439: "
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:396: "
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:466: "
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector:397: "
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
+ DocTest.printPrefix "Numeric.BLAS.Vector:467: "
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:398: "
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:468: "
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs, ArbVector ys) -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector:393: "
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
+ DocTest.printPrefix "Numeric.BLAS.Vector:463: "
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:445: "
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:515: "
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:442: "
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:512: "
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:478: "
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector 3 dim) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector:488: "
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:489: "
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:548: "
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:490: "
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
+ DocTest.printPrefix "Numeric.BLAS.Vector:558: "
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:506: "
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:559: "
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:536: "
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:560: "
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.negate xs == Vector.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:537: "
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:576: "
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.scale 2 xs == xs |+| xs)
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:606: "
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs |+| ys == ys |+| xs)
+     (forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:607: "
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs == xs |-| ys |+| ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:637: "
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:676: "
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> xs == Vector.negate (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:677: "
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (genNumber maxElem) $ \d (ArbVector xs) -> xs == Vector.raise (-d) (Vector.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:667: "
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:707: "
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mul xs ys == Vector.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:675: "
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:720: "
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:737: "
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
diff --git a/test/Test/ComplexDouble/Numeric/BLAS/Vector/Slice.hs b/test/Test/ComplexDouble/Numeric/BLAS/Vector/Slice.hs
--- a/test/Test/ComplexDouble/Numeric/BLAS/Vector/Slice.hs
+++ b/test/Test/ComplexDouble/Numeric/BLAS/Vector/Slice.hs
@@ -9,6 +9,8 @@
 
 {-# LINE 90 "src/Numeric/BLAS/Vector/Slice.hs" #-}
 import     qualified Test.Slice as TestSlice
+import     Test.ComplexDouble.Numeric.BLAS.Vector
+       (maxElem, maxDim, genVector, number_, real_, complex_)
 import     Test.ComplexDouble.Type (Number_)
 import     Test.Generator (genNumber)
 import     Test.Utility (approx, approxReal)
@@ -27,7 +29,6 @@
 import     Data.Array.Comfort.Shape ((::+)((::+)))
 import     Data.Tuple.HT (mapPair)
 import     Data.Complex (Complex)
-import     Control.Monad (replicateM)
 import     Control.Applicative (liftA2)
 
 import     qualified Test.QuickCheck as QC
@@ -36,12 +37,6 @@
 type     Real_ = RealOf Number_
 type     Complex_ = Complex Real_
 
-maxElem     :: Integer
-maxElem     = 10
-
-maxDim     :: Int
-maxDim     = 100
-
 maxDim1     :: Int
 maxDim1     = 10
 
@@ -63,25 +58,9 @@
 genShape     :: QC.Gen Shape
 genShape     = genShapeDim =<< QC.choose (0,maxDim1)
 
-genVector     ::
-       (Shape.C sh, Class.Floating a) =>
-       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
-genVector     shape genElem =
-       fmap (Vector.fromList shape) $
-       replicateM (Shape.size shape) genElem
-
 forAll_     :: (Show a) => QC.Gen a -> (a -> QC.Property) -> QC.Property
 forAll_     = QC.forAll
 
-real_     :: QC.Gen Real_
-real_     = genNumber maxElem
-
-complex_     :: QC.Gen Complex_
-complex_     = genNumber maxElem
-
-number_     :: QC.Gen Number_
-number_     = genNumber maxElem
-
 isNonEmpty     :: Shape.C sh => VectorSlice.T shA sh a -> Bool
 isNonEmpty     xs = Shape.size (VectorSlice.shape xs) > 0
 
@@ -150,123 +129,123 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:301: "
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \shape@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector shape number_) $ \xs -> VectorSlice.extract (Slice.column c . Slice.left . Slice.right) xs == Matrix.takeColumn c (Vector.takeLeft (Vector.takeRight (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:303: "
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:282: "
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forAll_ (TestSlice.genShapeSelect 4 100) $ \(TestSlice.ShapeSelect sh select) -> QC.forAll (genVector sh number_) $ \xs -> case TestSlice.instantiate sh select of TestSlice.Extraction slice cut -> VectorSlice.extract slice xs == cut xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:335: "
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:314: "
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.inner xs ys == Vector.dot (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:336: "
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:315: "
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.inner xs xs == Scalar.fromReal (VectorSlice.norm2Squared xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:419: "
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:398: "
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.sum xs == List.sum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:492: "
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:471: "
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf xs == List.maximum (0 : List.map absolute (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:503: "
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:482: "
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf1 xs == List.maximum (0 : List.map Scalar.norm1 (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:518: "
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:497: "
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = VectorSlice.argAbsMaximum xs in VectorSlice.access xs xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:519: "
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:498: "
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ listFromSlice xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:520: "
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:499: "
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> forSliced number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs; (_yi,ym) = VectorSlice.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (VectorSlice.toVector xs +++ VectorSlice.toVector ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:567: "
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:546: "
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.argAbsMaximum xs == VectorSlice.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:592: "
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:571: "
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \sh@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector sh $ genNumber 3) $ \xt -> let xs = takeColumn c xt in approx 1e-2 (VectorSlice.product xs) (List.product (listFromSlice (xs :: Sliced Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:603: "
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:582: "
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.minimum xs == List.minimum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:604: "
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:583: "
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.maximum xs == List.maximum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:620: "
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.limits xs == Array.limits (VectorSlice.toVector xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:629: "
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.negate xs == VectorSlice.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:651: "
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:630: "
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.scale 2 xs == VectorSlice.add xs xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:710: "
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:689: "
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.add xs ys == VectorSlice.add ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:711: "
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:690: "
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.toVector xs == VectorSlice.sub xs ys |+| VectorSlice.toVector ys)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:736: "
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:715: "
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.negate (VectorSlice.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:749: "
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll (genNumber maxElem) $ \d -> forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.raise (-d) (VectorSlice.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:766: "
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mul xs ys == VectorSlice.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:774: "
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:753: "
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mulConj xs ys == Vector.mul (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:898: "
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:877: "
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced complex_ $ \xs -> approxReal 1e-2 (VectorSlice.norm2 xs) $ let (xrs,xis) = VectorSlice.unzipComplex xs in sqrt $ VectorSlice.norm2Squared xrs + VectorSlice.norm2Squared xis)
diff --git a/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs b/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs
--- a/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs
+++ b/test/Test/ComplexFloat/Numeric/BLAS/Vector.hs
@@ -1,14 +1,15 @@
 -- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Vector.hs
-{-# LINE 98 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 100 "src/Numeric/BLAS/Vector.hs" #-}
 
 module Test.ComplexFloat.Numeric.BLAS.Vector where
 
 import Test.DocTest.Base
 import qualified Test.DocTest.Driver as DocTest
 
-{-# LINE 99 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 101 "src/Numeric/BLAS/Vector.hs" #-}
 import     Test.ComplexFloat.Type (Number_)
 import     Test.Generator (genNumber)
+import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
@@ -19,6 +20,8 @@
 import     Numeric.BLAS.Scalar (RealOf, absolute, minusOne)
 import     Data.Array.Comfort.Storable (Array, (!))
 import     Data.Complex (Complex((:+)))
+import     Data.Monoid ((<>))
+import     Data.Tuple.HT (mapPair)
 import     Control.Applicative (liftA2)
 import     Control.Monad (replicateM)
 
@@ -35,167 +38,244 @@
 maxDim     :: Int
 maxDim     = 100
 
-genVector     :: (Class.Floating a) => Integer -> Int -> QC.Gen (Vector a)
-genVector     maxE dim =
-       fmap (Vector.fromList (Shape.ZeroBased dim)) $
-       replicateM dim $ genNumber maxE
+genVector     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
+genVector     shape genElem =
+       fmap (Vector.fromList shape) $
+       replicateM (Shape.size shape) genElem
 
+real_     :: QC.Gen Real_
+real_     = genNumber maxElem
+
+complex_     :: QC.Gen Complex_
+complex_     = genNumber maxElem
+
+number_     :: QC.Gen Number_
+number_     = genNumber maxElem
+
 isNonEmpty     :: Shape.C sh => Array sh a -> Bool
 isNonEmpty     xs = Shape.size (Array.shape xs) > 0
 
-newtype     ArbRealVector = ArbRealVector (Vector Real_)
-       deriving (Show)
+forVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> prop) -> QC.Property
+forVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . shapeInt =<< QC.choose (0,maxDim))
+          (map Vector.autoFromList . QC.shrink . Vector.toList)
 
-instance     QC.Arbitrary ArbRealVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbRealVector $ genVector maxElem dim
-       shrink (ArbRealVector xs) =
-          map (ArbRealVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+forVector2     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> Vector a -> prop) -> QC.Property
+forVector2     genElem prop =
+       QC.forAllShrink
+          (do shape <- fmap shapeInt $ QC.choose (0,maxDim)
+              liftA2 (,) (genVector shape genElem) (genVector shape genElem))
+          (map (mapPair (Vector.autoFromList, Vector.autoFromList) . unzip) .
+           QC.shrink .
+           uncurry zip . mapPair (Vector.toList, Vector.toList))
+          (uncurry prop)
 
-newtype     ArbVector = ArbVector (Vector Number_)
-       deriving (Show)
+type     CyclicVector = Vector.Vector (Shape.Cyclic Int)
 
-instance     QC.Arbitrary ArbVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbVector $ genVector maxElem dim
-       shrink (ArbVector xs) =
-          map (ArbVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+genCyclicVector     ::
+       (Class.Floating a) =>
+       Integer -> Int -> QC.Gen (CyclicVector a)
+genCyclicVector     maxE dim =
+       fmap (Vector.fromList (Shape.Cyclic dim)) $
+       replicateM dim $ genNumber maxE
 
-data     ArbVector2 =
-          ArbVector2 (Vector Number_) (Vector Number_)
-       deriving (Show)
+cyclicVectorFromListGen     :: (Class.Floating a) => [a] -> CyclicVector a
+cyclicVectorFromListGen     xs = Vector.fromList (Shape.Cyclic $ length xs) xs
 
-instance     QC.Arbitrary ArbVector2 where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          liftA2 ArbVector2
-             (genVector maxElem dim) (genVector maxElem dim)
+cyclicVectorFromList     :: [Number_] -> CyclicVector Number_
+cyclicVectorFromList     = cyclicVectorFromListGen
 
+forCyclicVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (CyclicVector a -> prop) -> QC.Property
+forCyclicVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . Shape.Cyclic =<< QC.choose (0,maxDim))
+          (map cyclicVectorFromListGen . QC.shrink . Vector.toList)
+
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:212: "
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:239: "
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) (ArbVector ys) (ArbVector zs) -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:221: "
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:248: "
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:249: "
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:250: "
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:252: "
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:253: "
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:254: "
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:269: "
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList []))
+ DocTest.printPrefix "Numeric.BLAS.Vector:270: "
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:271: "
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:272: "
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+     (forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:291: "
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
      (QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_))
- DocTest.printPrefix "Numeric.BLAS.Vector:256: "
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:326: "
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:309: "
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:379: "
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.sum xs == List.sum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:369: "
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:439: "
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:396: "
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:466: "
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector:397: "
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
+ DocTest.printPrefix "Numeric.BLAS.Vector:467: "
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:398: "
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:468: "
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs, ArbVector ys) -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector:393: "
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
+ DocTest.printPrefix "Numeric.BLAS.Vector:463: "
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:445: "
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:515: "
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:442: "
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:512: "
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:478: "
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector 3 dim) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector:488: "
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:489: "
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:548: "
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:490: "
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
+ DocTest.printPrefix "Numeric.BLAS.Vector:558: "
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:506: "
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:559: "
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:536: "
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:560: "
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.negate xs == Vector.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:537: "
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:576: "
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.scale 2 xs == xs |+| xs)
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:606: "
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs |+| ys == ys |+| xs)
+     (forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:607: "
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs == xs |-| ys |+| ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:637: "
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:676: "
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> xs == Vector.negate (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:677: "
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (genNumber maxElem) $ \d (ArbVector xs) -> xs == Vector.raise (-d) (Vector.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:667: "
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:707: "
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mul xs ys == Vector.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:675: "
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:720: "
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:737: "
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
diff --git a/test/Test/ComplexFloat/Numeric/BLAS/Vector/Slice.hs b/test/Test/ComplexFloat/Numeric/BLAS/Vector/Slice.hs
--- a/test/Test/ComplexFloat/Numeric/BLAS/Vector/Slice.hs
+++ b/test/Test/ComplexFloat/Numeric/BLAS/Vector/Slice.hs
@@ -9,6 +9,8 @@
 
 {-# LINE 90 "src/Numeric/BLAS/Vector/Slice.hs" #-}
 import     qualified Test.Slice as TestSlice
+import     Test.ComplexFloat.Numeric.BLAS.Vector
+       (maxElem, maxDim, genVector, number_, real_, complex_)
 import     Test.ComplexFloat.Type (Number_)
 import     Test.Generator (genNumber)
 import     Test.Utility (approx, approxReal)
@@ -27,7 +29,6 @@
 import     Data.Array.Comfort.Shape ((::+)((::+)))
 import     Data.Tuple.HT (mapPair)
 import     Data.Complex (Complex)
-import     Control.Monad (replicateM)
 import     Control.Applicative (liftA2)
 
 import     qualified Test.QuickCheck as QC
@@ -36,12 +37,6 @@
 type     Real_ = RealOf Number_
 type     Complex_ = Complex Real_
 
-maxElem     :: Integer
-maxElem     = 10
-
-maxDim     :: Int
-maxDim     = 100
-
 maxDim1     :: Int
 maxDim1     = 10
 
@@ -63,25 +58,9 @@
 genShape     :: QC.Gen Shape
 genShape     = genShapeDim =<< QC.choose (0,maxDim1)
 
-genVector     ::
-       (Shape.C sh, Class.Floating a) =>
-       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
-genVector     shape genElem =
-       fmap (Vector.fromList shape) $
-       replicateM (Shape.size shape) genElem
-
 forAll_     :: (Show a) => QC.Gen a -> (a -> QC.Property) -> QC.Property
 forAll_     = QC.forAll
 
-real_     :: QC.Gen Real_
-real_     = genNumber maxElem
-
-complex_     :: QC.Gen Complex_
-complex_     = genNumber maxElem
-
-number_     :: QC.Gen Number_
-number_     = genNumber maxElem
-
 isNonEmpty     :: Shape.C sh => VectorSlice.T shA sh a -> Bool
 isNonEmpty     xs = Shape.size (VectorSlice.shape xs) > 0
 
@@ -150,123 +129,123 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:301: "
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \shape@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector shape number_) $ \xs -> VectorSlice.extract (Slice.column c . Slice.left . Slice.right) xs == Matrix.takeColumn c (Vector.takeLeft (Vector.takeRight (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:303: "
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:282: "
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forAll_ (TestSlice.genShapeSelect 4 100) $ \(TestSlice.ShapeSelect sh select) -> QC.forAll (genVector sh number_) $ \xs -> case TestSlice.instantiate sh select of TestSlice.Extraction slice cut -> VectorSlice.extract slice xs == cut xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:335: "
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:314: "
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.inner xs ys == Vector.dot (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:336: "
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:315: "
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.inner xs xs == Scalar.fromReal (VectorSlice.norm2Squared xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:419: "
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:398: "
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.sum xs == List.sum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:492: "
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:471: "
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf xs == List.maximum (0 : List.map absolute (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:503: "
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:482: "
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf1 xs == List.maximum (0 : List.map Scalar.norm1 (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:518: "
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:497: "
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = VectorSlice.argAbsMaximum xs in VectorSlice.access xs xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:519: "
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:498: "
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ listFromSlice xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:520: "
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:499: "
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> forSliced number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs; (_yi,ym) = VectorSlice.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (VectorSlice.toVector xs +++ VectorSlice.toVector ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:567: "
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:546: "
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.argAbsMaximum xs == VectorSlice.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:592: "
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:571: "
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \sh@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector sh $ genNumber 3) $ \xt -> let xs = takeColumn c xt in approx 1e-2 (VectorSlice.product xs) (List.product (listFromSlice (xs :: Sliced Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:603: "
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:582: "
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.minimum xs == List.minimum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:604: "
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:583: "
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.maximum xs == List.maximum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:620: "
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.limits xs == Array.limits (VectorSlice.toVector xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:629: "
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.negate xs == VectorSlice.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:651: "
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:630: "
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.scale 2 xs == VectorSlice.add xs xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:710: "
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:689: "
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.add xs ys == VectorSlice.add ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:711: "
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:690: "
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.toVector xs == VectorSlice.sub xs ys |+| VectorSlice.toVector ys)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:736: "
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:715: "
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.negate (VectorSlice.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:749: "
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll (genNumber maxElem) $ \d -> forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.raise (-d) (VectorSlice.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:766: "
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mul xs ys == VectorSlice.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:774: "
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:753: "
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mulConj xs ys == Vector.mul (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:898: "
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:877: "
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced complex_ $ \xs -> approxReal 1e-2 (VectorSlice.norm2 xs) $ let (xrs,xis) = VectorSlice.unzipComplex xs in sqrt $ VectorSlice.norm2Squared xrs + VectorSlice.norm2Squared xis)
diff --git a/test/Test/Double/Numeric/BLAS/Vector.hs b/test/Test/Double/Numeric/BLAS/Vector.hs
--- a/test/Test/Double/Numeric/BLAS/Vector.hs
+++ b/test/Test/Double/Numeric/BLAS/Vector.hs
@@ -1,14 +1,15 @@
 -- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Vector.hs
-{-# LINE 98 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 100 "src/Numeric/BLAS/Vector.hs" #-}
 
 module Test.Double.Numeric.BLAS.Vector where
 
 import Test.DocTest.Base
 import qualified Test.DocTest.Driver as DocTest
 
-{-# LINE 99 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 101 "src/Numeric/BLAS/Vector.hs" #-}
 import     Test.Double.Type (Number_)
 import     Test.Generator (genNumber)
+import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
@@ -19,6 +20,8 @@
 import     Numeric.BLAS.Scalar (RealOf, absolute, minusOne)
 import     Data.Array.Comfort.Storable (Array, (!))
 import     Data.Complex (Complex((:+)))
+import     Data.Monoid ((<>))
+import     Data.Tuple.HT (mapPair)
 import     Control.Applicative (liftA2)
 import     Control.Monad (replicateM)
 
@@ -35,167 +38,244 @@
 maxDim     :: Int
 maxDim     = 100
 
-genVector     :: (Class.Floating a) => Integer -> Int -> QC.Gen (Vector a)
-genVector     maxE dim =
-       fmap (Vector.fromList (Shape.ZeroBased dim)) $
-       replicateM dim $ genNumber maxE
+genVector     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
+genVector     shape genElem =
+       fmap (Vector.fromList shape) $
+       replicateM (Shape.size shape) genElem
 
+real_     :: QC.Gen Real_
+real_     = genNumber maxElem
+
+complex_     :: QC.Gen Complex_
+complex_     = genNumber maxElem
+
+number_     :: QC.Gen Number_
+number_     = genNumber maxElem
+
 isNonEmpty     :: Shape.C sh => Array sh a -> Bool
 isNonEmpty     xs = Shape.size (Array.shape xs) > 0
 
-newtype     ArbRealVector = ArbRealVector (Vector Real_)
-       deriving (Show)
+forVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> prop) -> QC.Property
+forVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . shapeInt =<< QC.choose (0,maxDim))
+          (map Vector.autoFromList . QC.shrink . Vector.toList)
 
-instance     QC.Arbitrary ArbRealVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbRealVector $ genVector maxElem dim
-       shrink (ArbRealVector xs) =
-          map (ArbRealVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+forVector2     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> Vector a -> prop) -> QC.Property
+forVector2     genElem prop =
+       QC.forAllShrink
+          (do shape <- fmap shapeInt $ QC.choose (0,maxDim)
+              liftA2 (,) (genVector shape genElem) (genVector shape genElem))
+          (map (mapPair (Vector.autoFromList, Vector.autoFromList) . unzip) .
+           QC.shrink .
+           uncurry zip . mapPair (Vector.toList, Vector.toList))
+          (uncurry prop)
 
-newtype     ArbVector = ArbVector (Vector Number_)
-       deriving (Show)
+type     CyclicVector = Vector.Vector (Shape.Cyclic Int)
 
-instance     QC.Arbitrary ArbVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbVector $ genVector maxElem dim
-       shrink (ArbVector xs) =
-          map (ArbVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+genCyclicVector     ::
+       (Class.Floating a) =>
+       Integer -> Int -> QC.Gen (CyclicVector a)
+genCyclicVector     maxE dim =
+       fmap (Vector.fromList (Shape.Cyclic dim)) $
+       replicateM dim $ genNumber maxE
 
-data     ArbVector2 =
-          ArbVector2 (Vector Number_) (Vector Number_)
-       deriving (Show)
+cyclicVectorFromListGen     :: (Class.Floating a) => [a] -> CyclicVector a
+cyclicVectorFromListGen     xs = Vector.fromList (Shape.Cyclic $ length xs) xs
 
-instance     QC.Arbitrary ArbVector2 where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          liftA2 ArbVector2
-             (genVector maxElem dim) (genVector maxElem dim)
+cyclicVectorFromList     :: [Number_] -> CyclicVector Number_
+cyclicVectorFromList     = cyclicVectorFromListGen
 
+forCyclicVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (CyclicVector a -> prop) -> QC.Property
+forCyclicVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . Shape.Cyclic =<< QC.choose (0,maxDim))
+          (map cyclicVectorFromListGen . QC.shrink . Vector.toList)
+
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:212: "
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:239: "
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) (ArbVector ys) (ArbVector zs) -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:221: "
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:248: "
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:249: "
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:250: "
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:252: "
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:253: "
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:254: "
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:269: "
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList []))
+ DocTest.printPrefix "Numeric.BLAS.Vector:270: "
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:271: "
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:272: "
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+     (forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:291: "
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
      (QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_))
- DocTest.printPrefix "Numeric.BLAS.Vector:256: "
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:326: "
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:309: "
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:379: "
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.sum xs == List.sum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:369: "
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:439: "
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:396: "
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:466: "
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector:397: "
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
+ DocTest.printPrefix "Numeric.BLAS.Vector:467: "
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:398: "
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:468: "
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs, ArbVector ys) -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector:393: "
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
+ DocTest.printPrefix "Numeric.BLAS.Vector:463: "
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:445: "
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:515: "
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:442: "
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:512: "
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:478: "
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector 3 dim) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector:488: "
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:489: "
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:548: "
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:490: "
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
+ DocTest.printPrefix "Numeric.BLAS.Vector:558: "
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:506: "
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:559: "
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:536: "
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:560: "
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.negate xs == Vector.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:537: "
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:576: "
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.scale 2 xs == xs |+| xs)
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:606: "
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs |+| ys == ys |+| xs)
+     (forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:607: "
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs == xs |-| ys |+| ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:637: "
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:676: "
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> xs == Vector.negate (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:677: "
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (genNumber maxElem) $ \d (ArbVector xs) -> xs == Vector.raise (-d) (Vector.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:667: "
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:707: "
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mul xs ys == Vector.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:675: "
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:720: "
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:737: "
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
diff --git a/test/Test/Double/Numeric/BLAS/Vector/Slice.hs b/test/Test/Double/Numeric/BLAS/Vector/Slice.hs
--- a/test/Test/Double/Numeric/BLAS/Vector/Slice.hs
+++ b/test/Test/Double/Numeric/BLAS/Vector/Slice.hs
@@ -9,6 +9,8 @@
 
 {-# LINE 90 "src/Numeric/BLAS/Vector/Slice.hs" #-}
 import     qualified Test.Slice as TestSlice
+import     Test.Double.Numeric.BLAS.Vector
+       (maxElem, maxDim, genVector, number_, real_, complex_)
 import     Test.Double.Type (Number_)
 import     Test.Generator (genNumber)
 import     Test.Utility (approx, approxReal)
@@ -27,7 +29,6 @@
 import     Data.Array.Comfort.Shape ((::+)((::+)))
 import     Data.Tuple.HT (mapPair)
 import     Data.Complex (Complex)
-import     Control.Monad (replicateM)
 import     Control.Applicative (liftA2)
 
 import     qualified Test.QuickCheck as QC
@@ -36,12 +37,6 @@
 type     Real_ = RealOf Number_
 type     Complex_ = Complex Real_
 
-maxElem     :: Integer
-maxElem     = 10
-
-maxDim     :: Int
-maxDim     = 100
-
 maxDim1     :: Int
 maxDim1     = 10
 
@@ -63,25 +58,9 @@
 genShape     :: QC.Gen Shape
 genShape     = genShapeDim =<< QC.choose (0,maxDim1)
 
-genVector     ::
-       (Shape.C sh, Class.Floating a) =>
-       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
-genVector     shape genElem =
-       fmap (Vector.fromList shape) $
-       replicateM (Shape.size shape) genElem
-
 forAll_     :: (Show a) => QC.Gen a -> (a -> QC.Property) -> QC.Property
 forAll_     = QC.forAll
 
-real_     :: QC.Gen Real_
-real_     = genNumber maxElem
-
-complex_     :: QC.Gen Complex_
-complex_     = genNumber maxElem
-
-number_     :: QC.Gen Number_
-number_     = genNumber maxElem
-
 isNonEmpty     :: Shape.C sh => VectorSlice.T shA sh a -> Bool
 isNonEmpty     xs = Shape.size (VectorSlice.shape xs) > 0
 
@@ -150,123 +129,123 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:301: "
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \shape@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector shape number_) $ \xs -> VectorSlice.extract (Slice.column c . Slice.left . Slice.right) xs == Matrix.takeColumn c (Vector.takeLeft (Vector.takeRight (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:303: "
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:282: "
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forAll_ (TestSlice.genShapeSelect 4 100) $ \(TestSlice.ShapeSelect sh select) -> QC.forAll (genVector sh number_) $ \xs -> case TestSlice.instantiate sh select of TestSlice.Extraction slice cut -> VectorSlice.extract slice xs == cut xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:335: "
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:314: "
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.inner xs ys == Vector.dot (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:336: "
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:315: "
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.inner xs xs == Scalar.fromReal (VectorSlice.norm2Squared xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:419: "
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:398: "
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.sum xs == List.sum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:492: "
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:471: "
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf xs == List.maximum (0 : List.map absolute (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:503: "
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:482: "
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf1 xs == List.maximum (0 : List.map Scalar.norm1 (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:518: "
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:497: "
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = VectorSlice.argAbsMaximum xs in VectorSlice.access xs xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:519: "
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:498: "
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ listFromSlice xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:520: "
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:499: "
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> forSliced number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs; (_yi,ym) = VectorSlice.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (VectorSlice.toVector xs +++ VectorSlice.toVector ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:567: "
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:546: "
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.argAbsMaximum xs == VectorSlice.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:592: "
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:571: "
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \sh@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector sh $ genNumber 3) $ \xt -> let xs = takeColumn c xt in approx 1e-2 (VectorSlice.product xs) (List.product (listFromSlice (xs :: Sliced Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:603: "
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:582: "
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.minimum xs == List.minimum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:604: "
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:583: "
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.maximum xs == List.maximum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:620: "
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.limits xs == Array.limits (VectorSlice.toVector xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:629: "
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.negate xs == VectorSlice.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:651: "
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:630: "
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.scale 2 xs == VectorSlice.add xs xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:710: "
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:689: "
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.add xs ys == VectorSlice.add ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:711: "
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:690: "
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.toVector xs == VectorSlice.sub xs ys |+| VectorSlice.toVector ys)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:736: "
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:715: "
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.negate (VectorSlice.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:749: "
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll (genNumber maxElem) $ \d -> forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.raise (-d) (VectorSlice.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:766: "
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mul xs ys == VectorSlice.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:774: "
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:753: "
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mulConj xs ys == Vector.mul (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:898: "
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:877: "
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced complex_ $ \xs -> approxReal 1e-2 (VectorSlice.norm2 xs) $ let (xrs,xis) = VectorSlice.unzipComplex xs in sqrt $ VectorSlice.norm2Squared xrs + VectorSlice.norm2Squared xis)
diff --git a/test/Test/Float/Numeric/BLAS/Vector.hs b/test/Test/Float/Numeric/BLAS/Vector.hs
--- a/test/Test/Float/Numeric/BLAS/Vector.hs
+++ b/test/Test/Float/Numeric/BLAS/Vector.hs
@@ -1,14 +1,15 @@
 -- Do not edit! Automatically created with doctest-extract from src/Numeric/BLAS/Vector.hs
-{-# LINE 98 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 100 "src/Numeric/BLAS/Vector.hs" #-}
 
 module Test.Float.Numeric.BLAS.Vector where
 
 import Test.DocTest.Base
 import qualified Test.DocTest.Driver as DocTest
 
-{-# LINE 99 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 101 "src/Numeric/BLAS/Vector.hs" #-}
 import     Test.Float.Type (Number_)
 import     Test.Generator (genNumber)
+import     Test.Slice (shapeInt)
 import     Test.Utility (approx)
 import     qualified Numeric.BLAS.Vector as Vector
 import     qualified Numeric.Netlib.Class as Class
@@ -19,6 +20,8 @@
 import     Numeric.BLAS.Scalar (RealOf, absolute, minusOne)
 import     Data.Array.Comfort.Storable (Array, (!))
 import     Data.Complex (Complex((:+)))
+import     Data.Monoid ((<>))
+import     Data.Tuple.HT (mapPair)
 import     Control.Applicative (liftA2)
 import     Control.Monad (replicateM)
 
@@ -35,167 +38,244 @@
 maxDim     :: Int
 maxDim     = 100
 
-genVector     :: (Class.Floating a) => Integer -> Int -> QC.Gen (Vector a)
-genVector     maxE dim =
-       fmap (Vector.fromList (Shape.ZeroBased dim)) $
-       replicateM dim $ genNumber maxE
+genVector     ::
+       (Shape.C sh, Class.Floating a) =>
+       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
+genVector     shape genElem =
+       fmap (Vector.fromList shape) $
+       replicateM (Shape.size shape) genElem
 
+real_     :: QC.Gen Real_
+real_     = genNumber maxElem
+
+complex_     :: QC.Gen Complex_
+complex_     = genNumber maxElem
+
+number_     :: QC.Gen Number_
+number_     = genNumber maxElem
+
 isNonEmpty     :: Shape.C sh => Array sh a -> Bool
 isNonEmpty     xs = Shape.size (Array.shape xs) > 0
 
-newtype     ArbRealVector = ArbRealVector (Vector Real_)
-       deriving (Show)
+forVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> prop) -> QC.Property
+forVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . shapeInt =<< QC.choose (0,maxDim))
+          (map Vector.autoFromList . QC.shrink . Vector.toList)
 
-instance     QC.Arbitrary ArbRealVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbRealVector $ genVector maxElem dim
-       shrink (ArbRealVector xs) =
-          map (ArbRealVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+forVector2     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (Vector a -> Vector a -> prop) -> QC.Property
+forVector2     genElem prop =
+       QC.forAllShrink
+          (do shape <- fmap shapeInt $ QC.choose (0,maxDim)
+              liftA2 (,) (genVector shape genElem) (genVector shape genElem))
+          (map (mapPair (Vector.autoFromList, Vector.autoFromList) . unzip) .
+           QC.shrink .
+           uncurry zip . mapPair (Vector.toList, Vector.toList))
+          (uncurry prop)
 
-newtype     ArbVector = ArbVector (Vector Number_)
-       deriving (Show)
+type     CyclicVector = Vector.Vector (Shape.Cyclic Int)
 
-instance     QC.Arbitrary ArbVector where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          fmap ArbVector $ genVector maxElem dim
-       shrink (ArbVector xs) =
-          map (ArbVector . Vector.autoFromList) .
-          QC.shrink . Vector.toList $ xs
+genCyclicVector     ::
+       (Class.Floating a) =>
+       Integer -> Int -> QC.Gen (CyclicVector a)
+genCyclicVector     maxE dim =
+       fmap (Vector.fromList (Shape.Cyclic dim)) $
+       replicateM dim $ genNumber maxE
 
-data     ArbVector2 =
-          ArbVector2 (Vector Number_) (Vector Number_)
-       deriving (Show)
+cyclicVectorFromListGen     :: (Class.Floating a) => [a] -> CyclicVector a
+cyclicVectorFromListGen     xs = Vector.fromList (Shape.Cyclic $ length xs) xs
 
-instance     QC.Arbitrary ArbVector2 where
-       arbitrary = do
-          dim <- QC.choose (0,maxDim)
-          liftA2 ArbVector2
-             (genVector maxElem dim) (genVector maxElem dim)
+cyclicVectorFromList     :: [Number_] -> CyclicVector Number_
+cyclicVectorFromList     = cyclicVectorFromListGen
 
+forCyclicVector     ::
+       (QC.Testable prop, QC.Arbitrary a, Class.Floating a, Show a) =>
+       QC.Gen a -> (CyclicVector a -> prop) -> QC.Property
+forCyclicVector     genElem =
+       QC.forAllShrink
+          (flip genVector genElem . Shape.Cyclic =<< QC.choose (0,maxDim))
+          (map cyclicVectorFromListGen . QC.shrink . Vector.toList)
+
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector:212: "
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:239: "
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 212 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) (ArbVector ys) (ArbVector zs) -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:221: "
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 239 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> forVector number_ $ \zs -> Vector.toList ((xs +++ ys) +++ zs) == Vector.toList (xs +++ (ys +++ zs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:248: "
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 221 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 248 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [] == (Vector.reverse $ Vector.autoFromList [] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:249: "
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 249 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [1] == (Vector.reverse $ Vector.autoFromList [1] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:250: "
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 250 "src/Numeric/BLAS/Vector.hs" #-}
+     (Vector.autoFromList [3,2,1] == (Vector.reverse $ Vector.autoFromList [1,2,3] :: Vector Number_))
+ DocTest.printPrefix "Numeric.BLAS.Vector:252: "
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 252 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> reverse (Vector.toList xs) == Vector.toList (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:253: "
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 253 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.reverse (Vector.reverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:254: "
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 254 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> Vector.reverse (xs <> ys) == Vector.reverse ys <> Vector.reverse xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:269: "
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 269 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [] == Vector.cyclicReverse (cyclicVectorFromList []))
+ DocTest.printPrefix "Numeric.BLAS.Vector:270: "
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 270 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1] == Vector.cyclicReverse (cyclicVectorFromList [1]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:271: "
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 271 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:272: "
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 272 "src/Numeric/BLAS/Vector.hs" #-}
+     (cyclicVectorFromList [1,6,5,4,3,2] == Vector.cyclicReverse (cyclicVectorFromList [1,2,3,4,5,6]))
+ DocTest.printPrefix "Numeric.BLAS.Vector:274: "
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 274 "src/Numeric/BLAS/Vector.hs" #-}
+     (forCyclicVector number_ $ \xs -> xs == Vector.cyclicReverse (Vector.cyclicReverse xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:291: "
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 291 "src/Numeric/BLAS/Vector.hs" #-}
      (QC.forAll (QC.choose (1,100)) $ \dim -> QC.forAll (QC.choose (0, dim-1)) $ \i -> QC.forAll (QC.choose (0, dim-1)) $ \j -> Vector.unit (Shape.ZeroBased dim) i == (Vector.swap i j (Vector.unit (Shape.ZeroBased dim) j) :: Vector Number_))
- DocTest.printPrefix "Numeric.BLAS.Vector:256: "
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:326: "
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 256 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:309: "
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 326 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.inner xs ys == Vector.dot (Vector.conjugate xs) ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:379: "
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 309 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.sum xs == List.sum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:369: "
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 379 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.sum xs == List.sum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:439: "
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 369 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector:396: "
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 439 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.normInf xs == List.maximum (0 : List.map absolute (Vector.toList xs)))
+ DocTest.printPrefix "Numeric.BLAS.Vector:466: "
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 396 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector:397: "
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 466 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = Vector.argAbsMaximum xs in xs!xi == xm)
+ DocTest.printPrefix "Numeric.BLAS.Vector:467: "
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 397 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:398: "
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 467 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = Vector.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ Vector.toList xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:468: "
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 398 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs, ArbVector ys) -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector:393: "
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 468 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> forVector number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = Vector.argAbsMaximum xs; (_yi,ym) = Vector.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (xs+++ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
+ DocTest.printPrefix "Numeric.BLAS.Vector:463: "
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 393 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 463 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbsMaximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(3,6.0 :+ 0.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:445: "
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:515: "
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 445 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:442: "
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 515 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.argAbsMaximum xs == Vector.argAbs1Maximum xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:512: "
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.example
-{-# LINE 442 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 512 "src/Numeric/BLAS/Vector.hs" #-}
    (Vector.argAbs1Maximum $ Vector.autoFromList [1:+2, 3:+4, 5, 6 :: Complex_])
   [ExpectedLine [LineChunk "(1,3.0 :+ 4.0)"]]
- DocTest.printPrefix "Numeric.BLAS.Vector:478: "
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 478 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector 3 dim) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector:488: "
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
- DocTest.property
-{-# LINE 488 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:489: "
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector:548: "
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 489 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:490: "
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 548 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (QC.choose (0,10)) $ \dim -> QC.forAll (genVector (shapeInt dim) (genNumber 3)) $ \xs -> approx 1e-2 (Vector.product xs) (List.product (Vector.toList (xs :: Vector Number_))))
+ DocTest.printPrefix "Numeric.BLAS.Vector:558: "
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 490 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:506: "
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 558 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.minimum xs == List.minimum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:559: "
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 506 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbRealVector xs) -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:536: "
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 559 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.maximum xs == List.maximum (Vector.toList xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:560: "
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 536 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.negate xs == Vector.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:537: "
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 560 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> - Vector.maximum xs == Vector.minimum (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:576: "
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 537 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> Vector.scale 2 xs == xs |+| xs)
+{-# LINE 576 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector real_ $ \xs -> isNonEmpty xs ==> Vector.limits xs == Array.limits xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:606: "
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 606 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs |+| ys == ys |+| xs)
+     (forVector number_ $ \xs -> Vector.negate xs == Vector.scale minusOne xs)
  DocTest.printPrefix "Numeric.BLAS.Vector:607: "
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
 {-# LINE 607 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> xs == xs |-| ys |+| ys)
- DocTest.printPrefix "Numeric.BLAS.Vector:637: "
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> Vector.scale 2 xs == xs |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:676: "
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 637 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector xs) -> xs == Vector.negate (Vector.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 676 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs |+| ys == ys |+| xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:677: "
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector.hs" #-}
-     (QC.forAll (genNumber maxElem) $ \d (ArbVector xs) -> xs == Vector.raise (-d) (Vector.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector:667: "
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 677 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> xs == xs |-| ys |+| ys)
+ DocTest.printPrefix "Numeric.BLAS.Vector:707: "
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 667 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mul xs ys == Vector.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector:675: "
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
+{-# LINE 707 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector number_ $ \xs -> xs == Vector.negate (Vector.negate xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:720: "
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
  DocTest.property
-{-# LINE 675 "src/Numeric/BLAS/Vector.hs" #-}
-     (\(ArbVector2 xs ys) -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
+{-# LINE 720 "src/Numeric/BLAS/Vector.hs" #-}
+     (QC.forAll (genNumber maxElem) $ \d -> forVector number_ $ \xs -> xs == Vector.raise (-d) (Vector.raise d xs))
+ DocTest.printPrefix "Numeric.BLAS.Vector:737: "
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 737 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mul xs ys == Vector.mul ys xs)
+ DocTest.printPrefix "Numeric.BLAS.Vector:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+ DocTest.property
+{-# LINE 745 "src/Numeric/BLAS/Vector.hs" #-}
+     (forVector2 number_ $ \xs ys -> Vector.mulConj xs ys == Vector.mul (Vector.conjugate xs) ys)
diff --git a/test/Test/Float/Numeric/BLAS/Vector/Slice.hs b/test/Test/Float/Numeric/BLAS/Vector/Slice.hs
--- a/test/Test/Float/Numeric/BLAS/Vector/Slice.hs
+++ b/test/Test/Float/Numeric/BLAS/Vector/Slice.hs
@@ -9,6 +9,8 @@
 
 {-# LINE 90 "src/Numeric/BLAS/Vector/Slice.hs" #-}
 import     qualified Test.Slice as TestSlice
+import     Test.Float.Numeric.BLAS.Vector
+       (maxElem, maxDim, genVector, number_, real_, complex_)
 import     Test.Float.Type (Number_)
 import     Test.Generator (genNumber)
 import     Test.Utility (approx, approxReal)
@@ -27,7 +29,6 @@
 import     Data.Array.Comfort.Shape ((::+)((::+)))
 import     Data.Tuple.HT (mapPair)
 import     Data.Complex (Complex)
-import     Control.Monad (replicateM)
 import     Control.Applicative (liftA2)
 
 import     qualified Test.QuickCheck as QC
@@ -36,12 +37,6 @@
 type     Real_ = RealOf Number_
 type     Complex_ = Complex Real_
 
-maxElem     :: Integer
-maxElem     = 10
-
-maxDim     :: Int
-maxDim     = 100
-
 maxDim1     :: Int
 maxDim1     = 10
 
@@ -63,25 +58,9 @@
 genShape     :: QC.Gen Shape
 genShape     = genShapeDim =<< QC.choose (0,maxDim1)
 
-genVector     ::
-       (Shape.C sh, Class.Floating a) =>
-       sh -> QC.Gen a -> QC.Gen (Vector.Vector sh a)
-genVector     shape genElem =
-       fmap (Vector.fromList shape) $
-       replicateM (Shape.size shape) genElem
-
 forAll_     :: (Show a) => QC.Gen a -> (a -> QC.Property) -> QC.Property
 forAll_     = QC.forAll
 
-real_     :: QC.Gen Real_
-real_     = genNumber maxElem
-
-complex_     :: QC.Gen Complex_
-complex_     = genNumber maxElem
-
-number_     :: QC.Gen Number_
-number_     = genNumber maxElem
-
 isNonEmpty     :: Shape.C sh => VectorSlice.T shA sh a -> Bool
 isNonEmpty     xs = Shape.size (VectorSlice.shape xs) > 0
 
@@ -150,123 +129,123 @@
 
 test :: DocTest.T ()
 test = do
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:301: "
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:280: "
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 301 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 280 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \shape@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector shape number_) $ \xs -> VectorSlice.extract (Slice.column c . Slice.left . Slice.right) xs == Matrix.takeColumn c (Vector.takeLeft (Vector.takeRight (xs :: Vector Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:303: "
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:282: "
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 303 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 282 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forAll_ (TestSlice.genShapeSelect 4 100) $ \(TestSlice.ShapeSelect sh select) -> QC.forAll (genVector sh number_) $ \xs -> case TestSlice.instantiate sh select of TestSlice.Extraction slice cut -> VectorSlice.extract slice xs == cut xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:335: "
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:314: "
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 335 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 314 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.inner xs ys == Vector.dot (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:336: "
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:315: "
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 336 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 315 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.inner xs xs == Scalar.fromReal (VectorSlice.norm2Squared xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:419: "
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:398: "
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 419 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 398 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.sum xs == List.sum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:492: "
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:471: "
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 492 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 471 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf xs == List.maximum (0 : List.map absolute (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:503: "
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:482: "
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 503 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 482 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.normInf1 xs == List.maximum (0 : List.map Scalar.norm1 (listFromSlice xs)))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:518: "
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:497: "
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 518 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 497 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (xi,xm) = VectorSlice.argAbsMaximum xs in VectorSlice.access xs xi == xm)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:519: "
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:498: "
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 519 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 498 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> isNonEmpty xs ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs in List.all (\x -> absolute x <= absolute xm) $ listFromSlice xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:520: "
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:499: "
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 520 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 499 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> forSliced number_ $ \ys -> isNonEmpty xs && isNonEmpty ys ==> let (_xi,xm) = VectorSlice.argAbsMaximum xs; (_yi,ym) = VectorSlice.argAbsMaximum ys; (zi,zm) = Vector.argAbsMaximum (VectorSlice.toVector xs +++ VectorSlice.toVector ys) in case zi of Left _ -> xm==zm && absolute xm >= absolute ym; Right _ -> ym==zm && absolute xm < absolute ym)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:567: "
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:546: "
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 567 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 546 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.argAbsMaximum xs == VectorSlice.argAbs1Maximum xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:592: "
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:571: "
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 592 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 571 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll genShape $ \sh@(_::+(_rows,columns)::+_) -> QC.forAll (QC.elements (Shape.indices columns)) $ \c -> QC.forAll (genVector sh $ genNumber 3) $ \xt -> let xs = takeColumn c xt in approx 1e-2 (VectorSlice.product xs) (List.product (listFromSlice (xs :: Sliced Number_))))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:603: "
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:582: "
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 603 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 582 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.minimum xs == List.minimum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:604: "
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:583: "
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 604 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 583 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.maximum xs == List.maximum (listFromSlice xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:620: "
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:599: "
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 620 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 599 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced real_ $ \xs -> isNonEmpty xs ==> VectorSlice.limits xs == Array.limits (VectorSlice.toVector xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:650: "
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:629: "
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 650 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 629 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.negate xs == VectorSlice.scale minusOne xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:651: "
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:630: "
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 651 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 630 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.scale 2 xs == VectorSlice.add xs xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:710: "
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:689: "
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 710 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 689 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.add xs ys == VectorSlice.add ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:711: "
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:690: "
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 711 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 690 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.toVector xs == VectorSlice.sub xs ys |+| VectorSlice.toVector ys)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:736: "
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:715: "
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 736 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 715 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.negate (VectorSlice.negate xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:749: "
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:728: "
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 749 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 728 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (QC.forAll (genNumber maxElem) $ \d -> forSliced number_ $ \xs -> VectorSlice.toVector xs == Vector.raise (-d) (VectorSlice.raise d xs))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:766: "
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:745: "
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 766 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 745 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mul xs ys == VectorSlice.mul ys xs)
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:774: "
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:753: "
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 774 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 753 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced2 number_ $ \xs ys -> VectorSlice.mulConj xs ys == Vector.mul (VectorSlice.conjugate xs) (VectorSlice.toVector ys))
- DocTest.printPrefix "Numeric.BLAS.Vector.Slice:898: "
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+ DocTest.printPrefix "Numeric.BLAS.Vector.Slice:877: "
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
  DocTest.property
-{-# LINE 898 "src/Numeric/BLAS/Vector/Slice.hs" #-}
+{-# LINE 877 "src/Numeric/BLAS/Vector/Slice.hs" #-}
      (forSliced complex_ $ \xs -> approxReal 1e-2 (VectorSlice.norm2 xs) $ let (xrs,xis) = VectorSlice.unzipComplex xs in sqrt $ VectorSlice.norm2Squared xrs + VectorSlice.norm2Squared xis)
