module Data.Vector.Strategies
( parVector
, NFData, using
) where
import Control.DeepSeq (NFData)
import Control.Parallel.Strategies
import qualified Data.Vector as V
parVector :: NFData a => Int -> Strategy (V.Vector a)
parVector minChunk vector
| minChunk <= 0 = parVector 1 vector
| otherwise = go vector
where
go vec =
let vLen = V.length vec
half = vLen `div` 2
in if vLen > minChunk
then do
go (V.unsafeSlice 0 half vec)
go (V.unsafeSlice half (vLen half) vec)
return vec
else evalChunk (vLen1) >> return vec
where
evalChunk (1) = return vec
evalChunk i = rpar (rdeepseq (vec V.! i)) >> evalChunk (i1)