{-# LANGUAGE PArr #-}
{-# OPTIONS -fvectorise #-}
{-# OPTIONS -fno-spec-constr-count #-}
module QSortVect (qsortVect) where

import Data.Array.Parallel.Prelude
import Data.Array.Parallel.Prelude.Double
import qualified Data.Array.Parallel.Prelude.Int as I

import qualified Prelude

qsortVect:: PArray Double -> PArray Double 
qsortVect xs = toPArrayP  (qsortVect' (fromPArrayP xs))

qsortVect':: [: Double :] -> [: Double :]
qsortVect' xs | lengthP xs I.<=  1 = xs
              | otherwise      = qsortVect' [:x | x <- xs, x < p:] +:+
                                            [:x | x <- xs, x == p:] +:+
                                 qsortVect' [:x | x <- xs, x > p:] 
             where p =  (xs !: (lengthP xs `I.div` 2))
