module Data.Repa.Flow.Generic.Process
(
compact_i
, scan_i
, indexed_i)
where
import Data.Repa.Flow.Generic.Base
compact_i
:: (Monad m, States i m)
=> (s -> a -> (s, Maybe b))
-> s
-> Sources i m a
-> m (Sources i m b)
compact_i f s0 (Sources n pullA)
= do
refs <- newRefs n s0
let pull_process i eatB ejectB
= do s1 <- readRefs refs i
pullA i (eatA_process s1) ejectA_process
where eatA_process s1 xA
= do case f s1 xA of
(s2', Nothing)
-> do writeRefs refs i s2'
pull_process i eatB ejectB
(s2', Just xB)
-> do writeRefs refs i s2'
eatB xB
ejectA_process = ejectB
return $ Sources n pull_process
scan_i
:: (Monad m, States i m)
=> (s -> a -> s)
-> s
-> Sources i m a
-> m (Sources i m s)
scan_i f s0 ss
= compact_i work_scan s0 ss
where
work_scan s x
= let s' = f s x
in (s', Just s')
indexed_i
:: (Monad m, States i m)
=> Sources i m a
-> m (Sources i m (Int, a))
indexed_i ss
= compact_i work_indexed 0 ss
where
work_indexed s x
= (s + 1, Just (s, x))