#include "fusion-phases.h"
module Data.Array.Parallel.PArray.PData.Unit where
import Data.Array.Parallel.PArray.PData.Base
import Data.Array.Parallel.Pretty
import qualified Data.Array.Parallel.Unlifted as U
import qualified Data.Vector as V
data instance PData ()
= PUnit Int
data instance PDatas ()
= PUnits (U.Array Int)
punit :: Int -> PData ()
punit = PUnit
instance PR () where
validPR _
= True
nfPR xx
= xx `seq` ()
similarPR _ _
= True
coversPR weak (PUnit n) i
| weak = i <= n
| otherwise = i < n
pprpPR _
= text "()"
pprpDataPR uu
= text $ show uu
emptyPR
= PUnit 0
replicatePR n _
= PUnit n
replicatesPR segd _
= PUnit (U.elementsSegd segd)
appendPR (PUnit len1) (PUnit len2)
= PUnit (len1 + len2)
appendsPR segdResult _ _ _ _
= PUnit (U.lengthSegd segdResult)
lengthPR (PUnit n)
= n
indexPR _ _
= ()
indexsPR _ srcixs
= PUnit $ U.length srcixs
indexvsPR _ _ srcixs
= PUnit $ U.length srcixs
extractPR _ _ len
= PUnit len
extractssPR _ ussegd
= PUnit $ U.sum $ U.lengthsOfSSegd ussegd
extractvsPR _ uvsegd
= PUnit $ U.sum $ U.takeLengthsOfVSegd uvsegd
packByTagPR _ tags tag
= PUnit (U.length $ U.filter (== tag) tags)
combine2PR sel2 _ _
= PUnit ( U.elementsSel2_0 sel2
+ U.elementsSel2_1 sel2)
fromVectorPR vec
= PUnit (V.length vec)
toVectorPR (PUnit len)
= V.replicate len ()
emptydPR
= PUnits $ U.empty
singletondPR (PUnit n)
= PUnits $ U.replicate 1 n
lengthdPR (PUnits pdatas)
= U.length pdatas
indexdPR (PUnits pdatas) ix
= PUnit $ U.index "indexdPR[Unit]" pdatas ix
appenddPR (PUnits lens1) (PUnits lens2)
= PUnits $ lens1 U.+:+ lens2
fromVectordPR vec
= PUnits $ V.convert $ V.map lengthPR vec
toVectordPR (PUnits uvecs)
= V.map PUnit $ V.convert uvecs
deriving instance Show (PData ())
deriving instance Show (PDatas ())
instance PprVirtual (PData ()) where
pprv (PUnit n)
= text $ "[ () x " ++ show n ++ " ]"