```-- While working on this module you are encouraged to remove it and fix
-- any warnings in the module. See
-- for details

-----------------------------------------------------------------------------
-- |
-- Module      :  Vector
-- Copyright   :  (c) Lennart Schmitt
--
-- Maintainer  :  lennart...schmitt@<nospam>gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- This module implements a few extensions for the vector-module.
-----------------------------------------------------------------------------

module Numeric.Vector (
-- * Data Types
RawVector,
Vector,

-- * Functions
average,
count,
fromList,-- | Convertes the representation from a simple list to a vector
maximumBy, -- | Calculates a lists maximum depending on a given ordering-function
maxPos,
toList,  -- | Convertes the representation from a vector to a simple list
transpose -- | Transposes a Vector
) where

import Data.Packed.Vector (Vector, toList, fromList)
import Data.List (transpose, maximumBy)

-- | A Vector represented by a simple list.
type RawVector a = [a]

-- | Calculates the lists elements average
--
-- > average [1,3,2] == 2.0
average :: Floating a => RawVector a -> a
average xs = (sum xs) / (count xs)

-- | Calculates the position of a lists maximum
--
-- > maxPos [1,10,8,3] == 1
maxPos :: RawVector Double -> Int
maxPos xs = fst \$ foldl1 f [(i,x)|(i,x)<- zip [0..] xs]
where
f a b = if snd a > snd b then a else b

-- | Counts the elements of a given list
--
-- > count [1,2,3,4,5] == 5
count :: Num b => RawVector a -> b
count = sum  .  map (const 1)
```