module PLY.Internal.StrictReplicate where
import Data.Vector.Generic (Vector, fromList)
import Data.Vector.Fusion.Bundle.Monadic (fromStream, toList)
import Data.Vector.Fusion.Bundle.Size (Size(..))
import Data.Vector.Fusion.Stream.Monadic (Stream (..), Step(..))
replicateStreamM' :: Monad m => Int -> m a -> Stream m a
replicateStreamM' n p = Stream step n
where
step i | i <= 0 = return Done
| otherwise = do { !x <- p; return $ Yield x (i1) }
replicateM' :: (Monad m, Vector v a) => Int -> m a -> m (v a)
replicateM' n p = do let s = replicateStreamM' n p
xs <- toList (fromStream s (Exact n))
return (fromList xs)