module Data.Repa.Array.Internals.Operator.Merge
( merge
, mergeMaybe)
where
import Data.Repa.Array.Internals.Bulk as A
import Data.Repa.Array.Internals.Target as A
import Data.Repa.Array.Internals.Layout as A
import Data.Repa.Stream as S
import Data.Repa.Eval.Stream as A
import qualified Data.Vector.Fusion.Stream as S
#include "repa-array.h"
merge :: ( Ord k
, BulkI l1 (k, a), BulkI l2 (k, b)
, TargetI lDst (k, c))
=> Name lDst
-> (k -> a -> b -> c)
-> (k -> a -> c)
-> (k -> b -> c)
-> Array l1 (k, a)
-> Array l2 (k, b)
-> Array lDst (k, c)
merge nDst fBoth fLeft fRight arrA arrB
= A.unstreamToArray nDst
$ S.mergeS fBoth fLeft fRight
(A.streamOfArray arrA)
(A.streamOfArray arrB)
mergeMaybe
:: ( Ord k
, BulkI l1 (k, a), BulkI l2 (k, b)
, TargetI lDst (k, c))
=> Name lDst
-> (k -> a -> b -> Maybe c)
-> (k -> a -> Maybe c)
-> (k -> b -> Maybe c)
-> Array l1 (k, a)
-> Array l2 (k, b)
-> Array lDst (k, c)
mergeMaybe nDst fBoth fLeft fRight arrA arrB
= A.unstreamToArray nDst
$ catMaybesS
$ S.map munge_mergeMaybe
$ mergeS fBoth fLeft fRight
(A.streamOfArray arrA)
(A.streamOfArray arrB)
where munge_mergeMaybe (_k, Nothing) = Nothing
munge_mergeMaybe (k, Just x) = Just (k, x)