module Data.Array.Parallel.PArr (
emptyPArr, replicatePArr, singletonPArr, indexPArr, lengthPArr
) where
import GHC.ST ( ST(..), runST )
import GHC.Base ( Array#, Int (I#), MutableArray#, newArray#,
unsafeFreezeArray#, indexArray#, )
import GHC.PArr
emptyPArr :: [:a:]
emptyPArr = replicatePArr 0 undefined
replicatePArr :: Int -> a -> [:a:]
replicatePArr n e = runST (do
marr# <- newArray n e
mkPArr n marr#)
singletonPArr :: a -> [:a:]
singletonPArr e = replicatePArr 1 e
indexPArr :: [:e:] -> Int -> e
indexPArr (PArr n arr#) i@(I# i#)
| i >= 0 && i < n =
case indexArray# arr# i# of (# e #) -> e
| otherwise = error $ "indexPArr: out of bounds parallel array index; " ++
"idx = " ++ show i ++ ", arr len = "
++ show n
lengthPArr :: [:a:] -> Int
lengthPArr (PArr n _) = n
data MPArr s e = MPArr !Int (MutableArray# s e)
newArray :: Int -> e -> ST s (MPArr s e)
newArray n@(I# n#) e = ST $ \s1# ->
case newArray# n# e s1# of { (# s2#, marr# #) ->
(# s2#, MPArr n marr# #)}
mkPArr :: Int -> MPArr s e -> ST s [:e:]
mkPArr n (MPArr _ marr#) = ST $ \s1# ->
case unsafeFreezeArray# marr# s1# of { (# s2#, arr# #) ->
(# s2#, PArr n arr# #) }