module Data.Array.Accelerate.Array.Delayed (
Delayable(delay, force), Delayed(..)
) where
import Data.Array.Accelerate.Array.Data
import Data.Array.Accelerate.Array.Representation
class Delayable a where
data Delayed a
delay :: a -> Delayed a
force :: Delayed a -> a
instance Delayable () where
data Delayed () = DelayedUnit
delay () = DelayedUnit
force DelayedUnit = ()
instance Delayable (Array dim e) where
data Delayed (Array dim e) = (Ix dim, ArrayElem e) =>
DelayedArray { shapeDA :: dim
, repfDA :: (dim -> e)
}
delay arr@(Array sh _) = DelayedArray sh (arr!)
force (DelayedArray sh f) = newArray sh f
instance (Delayable a1, Delayable a2) => Delayable (a1, a2) where
data Delayed (a1, a2) = DelayedPair (Delayed a1) (Delayed a2)
delay (a1, a2) = DelayedPair (delay a1) (delay a2)
force (DelayedPair a1 a2) = (force a1, force a2)