@@ -229,6 +229,7 @@ mixedOpsAheadly =
229229 return (x1 + y1 + z1)
230230 return (x + y + z)
231231
232+-- XXX Merge both the loops.
232233nestedLoops :: IO ()
233234nestedLoops = S.drain $ do
234235 S.yieldM $ hSetBuffering stdout LineBuffering
@@ -249,6 +250,29 @@ nestedLoops = S.drain $ do
249250 repeatIt = if n > 1 then loop name (n - 1) else S.nil
250251 in return result `S.wAsync` repeatIt
251252
253+parallelLoops :: IO ()
254+parallelLoops = do
255+ hSetBuffering stdout LineBuffering
256+ S.drain $ do
257+ x <- S.take 10 $ loop "A" `S.parallel` loop "B"
258+ S.yieldM $ myThreadId >>= putStr . show
259+ >> putStr " got "
260+ >> print x
261+
262+ where
263+
264+ -- we can just use
265+ -- parallely $ cycle1 $ yieldM (...)
266+ loop :: String -> SerialT IO (String, Int)
267+ loop name = do
268+ S.yieldM $ threadDelay 1000000
269+ rnd <- S.yieldM (randomIO :: IO Int)
270+ S.yieldM $ myThreadId >>= putStr . show
271+ >> putStr " yielding "
272+ >> print rnd
273+ return (name, rnd) `S.parallel` loop name
274+
275+
252276main :: IO ()
253277main = hspec $ H.parallel $ do
254278 describe "Filtering" $ do
@@ -266,6 +290,7 @@ main = hspec $ H.parallel $ do
266290 describe "Simple MonadError and MonadThrow" simpleMonadError
267291
268292 it "Nested loops" nestedLoops
293+ it "Parallel loops" parallelLoops
269294 {-
270295 describe "Composed MonadError serially" $ composeWithMonadError serially
271296 describe "Composed MonadError wSerially" $ composeWithMonadError wSerially