module Data.Repa.Flow.Chunked.Process
( process_i
, unfolds_i, A.StepUnfold(..))
where
import Data.Repa.Flow.Chunked.Base
import qualified Data.Repa.Array.Generic as A
import qualified Data.Repa.Array.Generic.Index as A
import qualified Data.Repa.Flow.Generic.Base as G
#include "repa-flow.h"
process_i
:: ( G.States i m
, A.BulkI lSrc a
, A.Bulk lDst b, A.Bulk lDst (A.Array lDst b)
, A.TargetI lDst b, A.TargetI lDst (A.Array lDst b))
=> (s -> a -> (s, A.Array lDst b))
-> s
-> Sources i m lSrc a
-> m (Sources i m lDst b)
process_i f z (G.Sources n pullA)
= do
refs <- G.newRefs n z
let pull_process i eatB ejectB
= do s1 <- G.readRefs refs i
pullA i (eatA_process s1) ejectA_process
where eatA_process s1 xA
= case A.process A.name f s1 xA of
(s1', arrB)
-> do G.writeRefs refs i s1'
eatB arrB
ejectA_process
= ejectB
return $ G.Sources n pull_process
unfolds_i
:: ( G.States i m
, A.BulkI lSrc a
, A.Bulk lDst b
, A.TargetI lDst b)
=> (a -> s -> A.StepUnfold s b)
-> s
-> Sources i m lSrc a
-> m (Sources i m lDst b)
unfolds_i f z (G.Sources n pullA)
= do
refs <- G.newRefs n z
let pull_unfolds i eatB ejectB
= do s1 <- G.readRefs refs i
pullA i (eatA_unfolds s1) ejectA_unfolds
where eatA_unfolds s1 xA
= case A.unfolds A.name f s1 xA of
(s1', arrB)
-> do G.writeRefs refs i s1'
eatB arrB
ejectA_unfolds
= ejectB
return $ G.Sources n pull_unfolds