module Data.Repa.Stream.Replicate
(replicatesS)
where
import Data.Vector.Fusion.Stream.Monadic (Stream(..), Step(..))
import qualified Data.Vector.Fusion.Stream.Size as S
#include "repa-stream.h"
replicatesS
:: Monad m
=> Stream m (Int, a)
-> Stream m a
replicatesS (Stream istepA sA0 _)
= Stream ostep (sA0, 0, Nothing) S.Unknown
where
ostep (sA, 0, mv)
= istepA sA >>= \rA
-> case rA of
Done -> return Done
Skip sA' -> return $ Skip (sA', 0, mv)
Yield (len, val) sA' -> return $ Skip (sA', len, Just val)
ostep (_, _, Nothing)
= return Done
ostep (sA, len, mv@(Just val))
= return $ Yield val (sA, len 1, mv)