#include "fusion-phases.h"
module Data.Array.Parallel.PArray.Base (
PArray(..),
lengthPA#,
dataPA#,
emptyPA,
replicatePA#,
replicatelPA#,
repeatPA#,
indexPA#,
extractPA#,
bpermutePA#,
appPA#,
applPA#,
packByTagPA#,
combine2PA#,
updatePA#,
fromListPA#, fromListPA,
nfPA,
)
where
import Data.Array.Parallel.Lifted.Unboxed (elementsSegd#)
import Data.Array.Parallel.PArray.PData
import Data.Array.Parallel.PArray.PRepr
import Data.Array.Parallel.Base (Tag)
import qualified Data.Array.Parallel.Unlifted as U
import GHC.Exts (Int#, Int(..), (+#), (*#))
import SpecConstr
data PArray a = PArray Int# (PData a)
lengthPA# :: PArray a -> Int#
lengthPA# (PArray n# _) = n#
dataPA# :: PArray a -> PData a
dataPA# (PArray _ d) = d
emptyPA :: PA a => PArray a
emptyPA
= PArray 0# emptyPD
replicatePA# :: PA a => Int# -> a -> PArray a
replicatePA# n# x
= PArray n# (replicatePD n# x)
replicatelPA# :: PA a => U.Segd -> PArray a -> PArray a
replicatelPA# segd (PArray _ xs)
= PArray (elementsSegd# segd) (replicatelPD segd xs)
repeatPA# :: PA a => Int# -> PArray a -> PArray a
repeatPA# m# (PArray n# xs)
= PArray (m# *# n#) (repeatPD m# n# xs)
indexPA# :: PA a => PArray a -> Int# -> a
indexPA# (PArray _ xs) i#
= indexPD xs i#
extractPA# :: PA a => PArray a -> Int# -> Int# -> PArray a
extractPA# (PArray _ xs) i# n#
= PArray n# (extractPD xs i# n#)
bpermutePA# :: PA a => PArray a -> Int# -> U.Array Int -> PArray a
bpermutePA# (PArray _ xs) n# is
= PArray n# (bpermutePD xs n# is)
appPA# :: PA a => PArray a -> PArray a -> PArray a
appPA# (PArray m# xs) (PArray n# ys)
= PArray (m# +# n#) (appPD xs ys)
applPA# :: PA a => U.Segd -> U.Segd -> PArray a -> U.Segd -> PArray a -> PArray a
applPA# segd is (PArray m# xs) js (PArray n# ys)
= PArray (m# +# n#) (applPD segd is xs js ys)
packByTagPA# :: PA a => PArray a -> Int# -> U.Array Tag -> Int# -> PArray a
packByTagPA# (PArray _ xs) n# tags t#
= PArray n# (packByTagPD xs n# tags t#)
combine2PA# :: PA a => Int# -> U.Sel2 -> PArray a -> PArray a -> PArray a
combine2PA# n# sel (PArray _ as) (PArray _ bs)
= PArray n# (combine2PD n# sel as bs)
updatePA# :: PA a => PArray a -> U.Array Int -> PArray a -> PArray a
updatePA# (PArray n# xs) is (PArray _ ys)
= PArray n# (updatePD xs is ys)
fromListPA# :: PA a => Int# -> [a] -> PArray a
fromListPA# n# xs
= PArray n# (fromListPD n# xs)
fromListPA :: PA a => [a] -> PArray a
fromListPA xs
= case length xs of
I# n# -> fromListPA# n# xs
nfPA :: PA a => PArray a -> ()
nfPA (PArray _ xs)
= nfPD xs