dph-lifted-vseg-0.6.0.1: Data/Array/Parallel/PArray/PData/Unit.hs
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE CPP #-}
#include "fusion-phases.h"
-- | PR instance for unit.
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
-------------------------------------------------------------------------------
-- | TODO: For arrays of units, we're currently maintaining their length so
-- that validPR works properly. In future we should ditch the length field
-- and rely on coversPR to check that indices are in bounds, like we do
-- with arrays of type PData Void.
data instance PData ()
= PUnit Int
data instance PDatas ()
= PUnits (U.Array Int)
punit :: Int -> PData ()
punit = PUnit
-- PR -------------------------------------------------------------------------
instance PR () where
{-# NOINLINE validPR #-}
validPR _
= True
{-# NOINLINE nfPR #-}
nfPR xx
= xx `seq` ()
{-# NOINLINE similarPR #-}
similarPR _ _
= True
{-# NOINLINE coversPR #-}
coversPR weak (PUnit n) i
| weak = i <= n
| otherwise = i < n
{-# NOINLINE pprpPR #-}
pprpPR _
= text "()"
{-# NOINLINE pprpDataPR #-}
pprpDataPR uu
= text $ show uu
-- Constructors -------------------------------
{-# INLINE_PDATA emptyPR #-}
emptyPR
= PUnit 0
{-# INLINE_PDATA replicatePR #-}
replicatePR n _
= PUnit n
{-# INLINE_PDATA replicatesPR #-}
replicatesPR segd _
= PUnit (U.elementsSegd segd)
{-# INLINE_PDATA appendPR #-}
appendPR (PUnit len1) (PUnit len2)
= PUnit (len1 + len2)
{-# INLINE_PDATA appendsPR #-}
appendsPR segdResult _ _ _ _
= PUnit (U.lengthSegd segdResult)
-- Projections -------------------------------
{-# INLINE_PDATA lengthPR #-}
lengthPR (PUnit n)
= n
{-# INLINE_PDATA indexPR #-}
indexPR _ _
= ()
{-# INLINE_PDATA indexsPR #-}
indexsPR _ srcixs
= PUnit $ U.length srcixs
{-# INLINE_PDATA indexvsPR #-}
indexvsPR _ _ srcixs
= PUnit $ U.length srcixs
{-# INLINE_PDATA extractPR #-}
extractPR _ _ len
= PUnit len
{-# INLINE_PDATA extractssPR #-}
extractssPR _ ussegd
= PUnit $ U.sum $ U.lengthsOfSSegd ussegd
{-# INLINE_PDATA extractvsPR #-}
extractvsPR _ uvsegd
= PUnit $ U.sum $ U.takeLengthsOfVSegd uvsegd
-- Pack and Combine ---------------------------
{-# INLINE_PDATA packByTagPR #-}
packByTagPR _ tags tag
= PUnit (U.length $ U.filter (== tag) tags)
{-# INLINE_PDATA combine2PR #-}
combine2PR sel2 _ _
= PUnit ( U.elementsSel2_0 sel2
+ U.elementsSel2_1 sel2)
-- Conversions --------------------------------
{-# NOINLINE fromVectorPR #-}
fromVectorPR vec
= PUnit (V.length vec)
{-# NOINLINE toVectorPR #-}
toVectorPR (PUnit len)
= V.replicate len ()
-- PDatas -------------------------------------
{-# INLINE_PDATA emptydPR #-}
emptydPR
= PUnits $ U.empty
{-# INLINE_PDATA singletondPR #-}
singletondPR (PUnit n)
= PUnits $ U.replicate 1 n
{-# INLINE_PDATA lengthdPR #-}
lengthdPR (PUnits pdatas)
= U.length pdatas
{-# INLINE_PDATA indexdPR #-}
indexdPR (PUnits pdatas) ix
= PUnit $ U.index "indexdPR[Unit]" pdatas ix
{-# INLINE_PDATA appenddPR #-}
appenddPR (PUnits lens1) (PUnits lens2)
= PUnits $ lens1 U.+:+ lens2
{-# NOINLINE fromVectordPR #-}
fromVectordPR vec
= PUnits $ V.convert $ V.map lengthPR vec
{-# NOINLINE toVectordPR #-}
toVectordPR (PUnits uvecs)
= V.map PUnit $ V.convert uvecs
-- Show -----------------------------------------------------------------------
deriving instance Show (PData ())
deriving instance Show (PDatas ())
instance PprVirtual (PData ()) where
pprv (PUnit n)
= text $ "[ () x " ++ show n ++ " ]"