module Data.Repa.Array.Meta.Delayed
( D(..), Array(..)
, fromFunction, toFunction
, delay
, map
, reverse)
where
import Data.Repa.Array.Generic.Index
import Data.Repa.Array.Internals.Bulk
import Data.Repa.Array.Internals.Load
import Data.Repa.Array.Internals.Target
import Debug.Trace
import GHC.Exts
import qualified Data.Repa.Eval.Generic.Par as Par
import qualified Data.Repa.Eval.Generic.Seq as Seq
import Prelude hiding (map, zipWith, reverse)
#include "repa-array.h"
data D l
= Delayed
{ delayedLayout :: l }
deriving instance Eq l => Eq (D l)
deriving instance Show l => Show (D l)
instance Layout l => Layout (D l) where
data Name (D l) = D (Name l)
type Index (D l) = Index l
name = D name
create (D n) len = Delayed (create n len)
extent (Delayed l) = extent l
toIndex (Delayed l) ix = toIndex l ix
fromIndex (Delayed l) i = fromIndex l i
deriving instance Eq (Name l) => Eq (Name (D l))
deriving instance Show (Name l) => Show (Name (D l))
instance Layout l => Bulk (D l) a where
data Array (D l) a
= ADelayed !l (Index l -> a)
layout (ADelayed l _) = Delayed l
index (ADelayed _l f) ix = f ix
instance (Layout l1, Target l2 a)
=> Load (D l1) l2 a where
loadS (ADelayed l1 get) !buf
= do let !(I# len) = size (extent l1)
let write ix x = unsafeWriteBuffer buf (I# ix) x
get' ix = get $ fromIndex l1 (I# ix)
Seq.fillLinear write get' len
touchBuffer buf
loadP gang (ADelayed l1 get) !buf
= do traceEventIO "Repa.loadP[Delayed]: start"
let !(I# len) = size (extent l1)
let write ix x = unsafeWriteBuffer buf (I# ix) x
get' ix = get $ fromIndex l1 (I# ix)
Par.fillChunked gang write get' len
touchBuffer buf
traceEventIO "Repa.loadP[Delayed]: end"
fromFunction :: l -> (Index l -> a) -> Array (D l) a
fromFunction l f
= ADelayed l f
toFunction :: Bulk l a
=> Array (D l) a -> (l, Index l -> a)
toFunction (ADelayed l f) = (l, f)
delay :: Bulk l a
=> Array l a -> Array (D l) a
delay arr = map id arr
map :: Bulk l a
=> (a -> b) -> Array l a -> Array (D l) b
map f arr
= ADelayed (layout arr) (f . index arr)
reverse :: BulkI l a
=> Array l a -> Array (D l) a
reverse !arr
= let !len = size (extent $ layout arr)
get ix = arr `index` (len ix 1)
in fromFunction (layout arr) get