module Data.Array.Repa.Repr.Partitioned
( P, Array (..)
, Range(..)
, inRange)
where
import Data.Array.Repa.Base
import Data.Array.Repa.Shape
import Data.Array.Repa.Eval
import Data.Array.Repa.Repr.Delayed
data P r1 r2
data instance Array (P r1 r2) sh e
= APart !sh
!(Range sh) !(Array r1 sh e)
!(Array r2 sh e)
data Range sh
= Range !sh !sh
(sh -> Bool)
inRange :: Range sh -> sh -> Bool
inRange (Range _ _ p) ix
= p ix
instance (Repr r1 e, Repr r2 e) => Repr (P r1 r2) e where
index (APart _ range arr1 arr2) ix
| inRange range ix = index arr1 ix
| otherwise = index arr2 ix
linearIndex arr@(APart sh _ _ _) ix
= index arr $ fromIndex sh ix
extent (APart sh _ _ _)
= sh
deepSeqArray (APart sh range arr1 arr2) y
= sh `deepSeq` range `deepSeqRange` arr1 `deepSeqArray` arr2 `deepSeqArray` y
deepSeqRange :: Shape sh => Range sh -> b -> b
deepSeqRange (Range ix sz f) y
= ix `deepSeq` sz `deepSeq` f `seq` y
instance ( FillRange r1 r3 sh e, Fill r2 r3 sh e
, Fillable r3 e)
=> Fill (P r1 r2) r3 sh e where
fillP (APart _ (Range ix sz _) arr1 arr2) marr
= do fillRangeP arr1 marr ix sz
fillP arr2 marr
fillS (APart _ (Range ix sz _) arr1 arr2) marr
= do fillRangeS arr1 marr ix sz
fillS arr2 marr