module Data.Repa.Array.Internals.Bulk
( Bulk (..), BulkI
, (!)
, length
, first, last
, toList
, toLists
, toListss)
where
import Data.Repa.Array.Internals.Shape
import Data.Repa.Array.Internals.Layout
import Prelude hiding (length, last)
#include "repa-array.h"
class Layout l => Bulk l a where
data Array l a
layout :: Array l a -> l
index :: Array l a -> Index l -> a
type BulkI l a = (Bulk l a, Index l ~ Int)
(!) :: Bulk l a => Array l a -> Index l -> a
(!) = index
length :: Bulk l a
=> Array l a -> Int
length !arr = size (extent (layout arr))
first :: BulkI l a
=> Array l a -> Maybe a
first !arr
= if length arr >= 1
then Just $ index arr 0
else Nothing
last :: BulkI l a
=> Array l a -> Maybe a
last !arr
= if length arr >= 1
then Just $ index arr (length arr 1)
else Nothing
toList :: Bulk l a
=> Array l a -> [a]
toList !arr
= loop_fromList [] 0
where !lo = layout arr
!len = length arr
loop_fromList !acc !ix
| ix >= len = reverse acc
| otherwise
= let !x = arr `index` (fromIndex lo ix)
in loop_fromList (x : acc) (ix + 1)
toLists :: ( Bulk l1 (Array l2 a)
, Bulk l2 a)
=> Array l1 (Array l2 a)
-> [[a]]
toLists arr
= let !ll' = toList arr
in map toList ll'
toListss :: ( Bulk l1 (Array l2 (Array l3 a))
, Bulk l2 (Array l3 a)
, Bulk l3 a)
=> Array l1 (Array l2 (Array l3 a))
-> [[[a]]]
toListss arr
= let !ll' = toLists arr
in map (map toList) ll'