repa-2.0.0.1: Data/Array/Repa/Operators/Traverse.hs
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE ExplicitForAll #-}
module Data.Array.Repa.Operators.Traverse
( traverse, unsafeTraverse
, traverse2, unsafeTraverse2
, traverse3, unsafeTraverse3
, traverse4, unsafeTraverse4)
where
import Data.Array.Repa.Internals.Elt
import Data.Array.Repa.Internals.Base
import Data.Array.Repa.Shape as S
-- Generic Traversal -----------------------------------------------------------------------------
-- | Unstructured traversal.
traverse
:: forall sh sh' a b
. (Shape sh, Shape sh', Elt a)
=> Array sh a -- ^ Source array.
-> (sh -> sh') -- ^ Function to produce the extent of the result.
-> ((sh -> a) -> sh' -> b) -- ^ Function to produce elements of the result.
-- It is passed a lookup function to get elements of the source.
-> Array sh' b
{-# INLINE traverse #-}
traverse arr transExtent newElem
= arr `deepSeqArray`
fromFunction (transExtent (extent arr)) (newElem (arr !))
{-# INLINE unsafeTraverse #-}
unsafeTraverse arr transExtent newElem
= arr `deepSeqArray`
fromFunction (transExtent (extent arr)) (newElem (unsafeIndex arr))
-- | Unstructured traversal over two arrays at once.
traverse2, unsafeTraverse2
:: forall sh sh' sh'' a b c
. ( Shape sh, Shape sh', Shape sh''
, Elt a, Elt b, Elt c)
=> Array sh a -- ^ First source array.
-> Array sh' b -- ^ Second source array.
-> (sh -> sh' -> sh'') -- ^ Function to produce the extent of the result.
-> ((sh -> a) -> (sh' -> b)
-> (sh'' -> c)) -- ^ Function to produce elements of the result.
-- It is passed lookup functions to get elements of the
-- source arrays.
-> Array sh'' c
{-# INLINE traverse2 #-}
traverse2 arrA arrB transExtent newElem
= arrA `deepSeqArray` arrB `deepSeqArray`
fromFunction
(transExtent (extent arrA) (extent arrB))
(newElem (arrA !) (arrB !))
{-# INLINE unsafeTraverse2 #-}
unsafeTraverse2 arrA arrB transExtent newElem
= arrA `deepSeqArray` arrB `deepSeqArray`
fromFunction
(transExtent (extent arrA) (extent arrB))
(newElem (unsafeIndex arrA) (unsafeIndex arrB))
-- | Unstructured traversal over three arrays at once.
traverse3, unsafeTraverse3
:: forall sh1 sh2 sh3 sh4
a b c d
. ( Shape sh1, Shape sh2, Shape sh3, Shape sh4
, Elt a, Elt b, Elt c, Elt d)
=> Array sh1 a
-> Array sh2 b
-> Array sh3 c
-> (sh1 -> sh2 -> sh3 -> sh4)
-> ( (sh1 -> a) -> (sh2 -> b)
-> (sh3 -> c)
-> sh4 -> d )
-> Array sh4 d
{-# INLINE traverse3 #-}
traverse3 arrA arrB arrC transExtent newElem
= arrA `deepSeqArray` arrB `deepSeqArray` arrC `deepSeqArray`
fromFunction
(transExtent (extent arrA) (extent arrB) (extent arrC))
(newElem (arrA !) (arrB !) (arrC !))
{-# INLINE unsafeTraverse3 #-}
unsafeTraverse3 arrA arrB arrC transExtent newElem
= arrA `deepSeqArray` arrB `deepSeqArray` arrC `deepSeqArray`
fromFunction
(transExtent (extent arrA) (extent arrB) (extent arrC))
(newElem (unsafeIndex arrA) (unsafeIndex arrB) (unsafeIndex arrC))
-- | Unstructured traversal over four arrays at once.
traverse4, unsafeTraverse4
:: forall sh1 sh2 sh3 sh4 sh5
a b c d e
. ( Shape sh1, Shape sh2, Shape sh3, Shape sh4, Shape sh5
, Elt a, Elt b, Elt c, Elt d, Elt e)
=> Array sh1 a
-> Array sh2 b
-> Array sh3 c
-> Array sh4 d
-> (sh1 -> sh2 -> sh3 -> sh4 -> sh5 )
-> ( (sh1 -> a) -> (sh2 -> b)
-> (sh3 -> c) -> (sh4 -> d)
-> sh5 -> e )
-> Array sh5 e
{-# INLINE traverse4 #-}
traverse4 arrA arrB arrC arrD transExtent newElem
= arrA `deepSeqArray` arrB `deepSeqArray` arrC `deepSeqArray` arrD `deepSeqArray`
fromFunction
(transExtent (extent arrA) (extent arrB) (extent arrC) (extent arrD))
(newElem (arrA !) (arrB !) (arrC !) (arrD !))
{-# INLINE unsafeTraverse4 #-}
unsafeTraverse4 arrA arrB arrC arrD transExtent newElem
= arrA `deepSeqArray` arrB `deepSeqArray` arrC `deepSeqArray` arrD `deepSeqArray`
fromFunction
(transExtent (extent arrA) (extent arrB) (extent arrC) (extent arrD))
(newElem (unsafeIndex arrA) (unsafeIndex arrB) (unsafeIndex arrC) (unsafeIndex arrD))