module Data.Repa.Array.Internals.Operator.Process
( process
, unfolds, StepUnfold (..))
where
import Data.Repa.Array.Internals.Operator.Concat as A
import Data.Repa.Array.Internals.Layout as A
import Data.Repa.Array.Internals.Target as A
import Data.Repa.Array.Internals.Bulk as A
import Data.Repa.Chain as C
import Data.Repa.Eval.Chain as A
import Prelude hiding (concat)
#include "repa-array.h"
process :: ( BulkI lSrc a
, BulkI lDst b, Bulk lDst (Array lDst b)
, TargetI lDst b
, TargetI lDst (Array lDst b))
=> Name lDst
-> (s -> a -> (s, Array lDst b))
-> s
-> Array lSrc a
-> (s, Array lDst b)
process nDst f s0 arr
= let
work_process s x
= case f s x of
(s', arr') -> return (s', Just arr')
(arrs, (_, s2))
= A.unchainToArray nDst
$ C.scanMaybeC work_process s0
$ A.chainOfArray arr
in (s2, concat nDst arrs)
unfolds :: ( BulkI lSrc a
, TargetI lDst b)
=> Name lDst
-> (a -> s -> (StepUnfold s b))
-> s
-> Array lSrc a
-> (s, Array lDst b)
unfolds nDst f s0 arr
= let
work_process xa s
= case f xa s of
mxb -> return mxb
(arr', (_, s2, _))
= A.unchainToArray nDst
$ C.unfoldsC work_process s0
$ A.chainOfArray arr
in (s2, arr')