dph-lifted-vseg-0.6.0.1: Data/Array/Parallel/PArray/PRepr/Instances.hs
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE CPP, UndecidableInstances #-}
#include "fusion-phases.h"
-- | Simple instances for the PRRepr/PA family and class.
-- This module is kept separate from PRepr.Base to break an import cycle
-- between PRepr.Base PRepr.Instances and PArray.PData.Wrap
--
module Data.Array.Parallel.PArray.PRepr.Instances where
import Data.Array.Parallel.PArray.Types
import Data.Array.Parallel.PArray.PRepr.Base
import Data.Array.Parallel.PArray.PData.Base
import Data.Array.Parallel.PArray.PData.Void
import Data.Array.Parallel.PArray.PData.Sum2
import Data.Array.Parallel.PArray.PData.Word8
import Data.Array.Parallel.PArray.PData.Wrap ()
import Data.Array.Parallel.PArray.PData.Unit ()
import Data.Array.Parallel.PArray.PData.Nested ()
import Data.Array.Parallel.PArray.PData.Tuple2 ()
import Data.Array.Parallel.PArray.PData.Int ()
import Data.Array.Parallel.PArray.PData.Double ()
import qualified Data.Array.Parallel.Unlifted as U
import qualified Data.Vector as V
import Data.Word
-- Void -----------------------------------------------------------------------
type instance PRepr Void = Void
instance PA Void where
toPRepr = id
fromPRepr = id
toArrPRepr = id
fromArrPRepr = id
toArrPReprs = id
fromArrPReprs = id
-- Unit -----------------------------------------------------------------------
type instance PRepr () = ()
instance PA () where
toPRepr = id
fromPRepr = id
toArrPRepr = id
fromArrPRepr = id
toArrPReprs = id
fromArrPReprs = id
-- Int ------------------------------------------------------------------------
type instance PRepr Int = Int
instance PA Int where
toPRepr = id
fromPRepr = id
toArrPRepr = id
fromArrPRepr = id
toArrPReprs = id
fromArrPReprs = id
-- Int ------------------------------------------------------------------------
type instance PRepr Word8 = Word8
instance PA Word8 where
toPRepr = id
fromPRepr = id
toArrPRepr = id
fromArrPRepr = id
toArrPReprs = id
fromArrPReprs = id
-- Double ---------------------------------------------------------------------
type instance PRepr Double = Double
instance PA Double where
toPRepr = id
fromPRepr = id
toArrPRepr = id
fromArrPRepr = id
toArrPReprs = id
fromArrPReprs = id
-- Bool -----------------------------------------------------------------------
-- | We use the `Void` type for both sides because we only care about the tag.
-- The `Void` fields don't use any space at runtime.
type instance PRepr Bool
= Sum2 Void Void
data instance PData Bool
= PBool U.Sel2
data instance PDatas Bool
= PBools (V.Vector U.Sel2)
instance PA Bool where
{-# INLINE toPRepr #-}
toPRepr False = Alt2_1 void
toPRepr True = Alt2_2 void
{-# INLINE fromPRepr #-}
fromPRepr (Alt2_1 _) = False
fromPRepr (Alt2_2 _) = True
{-# INLINE toArrPRepr #-}
toArrPRepr (PBool sel)
= PSum2 sel pvoid pvoid
{-# INLINE fromArrPRepr #-}
fromArrPRepr (PSum2 sel _ _)
= PBool sel
{-# INLINE toArrPReprs #-}
toArrPReprs (PBools sels)
= PSum2s sels
(pvoids $ V.length sels)
(pvoids $ V.length sels)
{-# INLINE fromArrPReprs #-}
fromArrPReprs (PSum2s sels _ _)
= PBools sels
-- Ordering -------------------------------------------------------------------
type instance PRepr Ordering
= Word8
data instance PData Ordering
= POrdering (U.Array Word8)
data instance PDatas Ordering
= POrderings (U.Arrays Word8)
instance PA Ordering where
{-# INLINE toPRepr #-}
toPRepr LT = 0
toPRepr EQ = 1
toPRepr GT = 2
{-# INLINE fromPRepr #-}
fromPRepr 0 = LT
fromPRepr 1 = EQ
fromPRepr 2 = GT
fromPRepr _ = error "dph-prim-vseg: bad value converting Word8 to Ordering"
{-# INLINE toArrPRepr #-}
toArrPRepr (POrdering arr)
= PWord8 arr
{-# INLINE fromArrPRepr #-}
fromArrPRepr (PWord8 arr)
= POrdering arr
{-# INLINE toArrPReprs #-}
toArrPReprs (POrderings arrs)
= PWord8s arrs
{-# INLINE fromArrPReprs #-}
fromArrPReprs (PWord8s arrs)
= POrderings arrs
-- Either ---------------------------------------------------------------------
type instance PRepr (Either a b)
= Sum2 a b
data instance PData (Either a b)
= PEither U.Sel2 (PData a) (PData b)
data instance PDatas (Either a b)
= PEithers (V.Vector U.Sel2) (PDatas a) (PDatas b)
instance (PR a, PR b) => PA (Either a b) where
{-# INLINE toPRepr #-}
toPRepr xx
= case xx of
Left x -> Alt2_1 x
Right y -> Alt2_2 y
{-# INLINE fromPRepr #-}
fromPRepr (Alt2_1 x) = Left x
fromPRepr (Alt2_2 x) = Right x
{-# INLINE toArrPRepr #-}
toArrPRepr (PEither sel pdata1 pdata2)
= PSum2 sel pdata1 pdata2
{-# INLINE fromArrPRepr #-}
fromArrPRepr (PSum2 sel pdata1 pdata2)
= PEither sel pdata1 pdata2
{-# INLINE toArrPReprs #-}
toArrPReprs (PEithers sels pdatas1 pdatas2)
= PSum2s sels pdatas1 pdatas2
{-# INLINE fromArrPReprs #-}
fromArrPReprs (PSum2s sels pdatas1 pdatas2)
= PEithers sels pdatas1 pdatas2