module Data.Array.Accelerate.Array.Representation (
Ix(..), SliceIx(..), SliceIndex(..),
) where
import Data.Array.Accelerate.Type
class Eq ix => Ix ix where
dim :: ix -> Int
size :: ix -> Int
intersect :: ix -> ix -> ix
ignore :: ix
index :: ix -> ix -> Int
iter :: ix -> (ix -> a) -> (a -> a -> a) -> a -> a
rangeToShape :: (ix, ix) -> ix
shapeToRange :: ix -> (ix, ix)
instance Ix () where
dim () = 0
size () = 1
intersect () () = ()
ignore = ()
index () () = 0
iter () f _ _ = f ()
rangeToShape ((), ()) = ()
shapeToRange () = ((), ())
instance Ix ix => Ix (ix, Int) where
dim (sh, _) = dim sh + 1
size (sh, sz) = size sh * sz
(sh1, sz1) `intersect` (sh2, sz2) = (sh1 `intersect` sh2, sz1 `min` sz2)
ignore = (ignore, 1)
index (sh, sz) (ix, i)
| i >= 0 && i < sz = index sh ix + size sh * i
| otherwise
= error "Data.Array.Accelerate.Array: index out of bounds"
iter (sh, sz) f c r = iter' 0
where
iter' i | i >= sz = r
| otherwise = iter sh (\ix -> f (ix, i)) c r `c` iter' (i + 1)
rangeToShape ((sh1, sz1), (sh2, sz2))
= (rangeToShape (sh1, sh2), sz2 sz1 + 1)
shapeToRange (sh, sz)
= let (low, high) = shapeToRange sh
in
((low, 0), (high, sz 1))
class SliceIx sl where
type Slice sl
type CoSlice sl
type SliceDim sl
sliceIndex :: sl -> SliceIndex sl
(Slice sl)
(CoSlice sl)
(SliceDim sl)
instance SliceIx () where
type Slice () = ()
type CoSlice () = ()
type SliceDim () = ()
sliceIndex _ = SliceNil
instance SliceIx sl => SliceIx (sl, ()) where
type Slice (sl, ()) = (Slice sl, Int)
type CoSlice (sl, ()) = CoSlice sl
type SliceDim (sl, ()) = (SliceDim sl, Int)
sliceIndex _ = SliceAll (sliceIndex (undefined::sl))
instance SliceIx sl => SliceIx (sl, Int) where
type Slice (sl, Int) = Slice sl
type CoSlice (sl, Int) = (CoSlice sl, Int)
type SliceDim (sl, Int) = (SliceDim sl, Int)
sliceIndex _ = SliceFixed (sliceIndex (undefined::sl))
data SliceIndex ix slice coSlice sliceDim where
SliceNil :: SliceIndex () () () ()
SliceAll ::
SliceIndex ix slice co dim -> SliceIndex (ix, ()) (slice, Int) co (dim, Int)
SliceFixed ::
SliceIndex ix slice co dim -> SliceIndex (ix, Int) slice (co, Int) (dim, Int)