@@ -229,6 +229,7 @@ mixedOpsAheadly =
229 return (x1 + y1 + z1)
229 return (x1 + y1 + z1)
230 return (x + y + z)
230 return (x + y + z)
232+-- XXX Merge both the loops.
232nestedLoops :: IO ()
233nestedLoops :: IO ()
233nestedLoops = S.drain $ do
234nestedLoops = S.drain $ do
234 S.yieldM $ hSetBuffering stdout LineBuffering
235 S.yieldM $ hSetBuffering stdout LineBuffering
@@ -249,6 +250,29 @@ nestedLoops = S.drain $ do
249 repeatIt = if n > 1 then loop name (n - 1) else S.nil
250 repeatIt = if n > 1 then loop name (n - 1) else S.nil
250 in return result `S.wAsync` repeatIt
251 in return result `S.wAsync` repeatIt
253+parallelLoops :: IO ()
255+ hSetBuffering stdout LineBuffering
257+ x <- S.take 10 $ loop "A" `S.parallel` loop "B"
258+ S.yieldM $ myThreadId >>= putStr . show
265+ -- parallely $ cycle1 $ yieldM (...)
266+ loop :: String -> SerialT IO (String, Int)
268+ S.yieldM $ threadDelay 1000000
269+ rnd <- S.yieldM (randomIO :: IO Int)
270+ S.yieldM $ myThreadId >>= putStr . show
271+ >> putStr " yielding "
273+ return (name, rnd) `S.parallel` loop name
252main :: IO ()
276main :: IO ()
253main = hspec $ H.parallel $ do
277main = hspec $ H.parallel $ do
254 describe "Filtering" $ do
278 describe "Filtering" $ do
@@ -266,6 +290,7 @@ main = hspec $ H.parallel $ do
266 describe "Simple MonadError and MonadThrow" simpleMonadError
290 describe "Simple MonadError and MonadThrow" simpleMonadError
268 it "Nested loops" nestedLoops
292 it "Nested loops" nestedLoops
293+ it "Parallel loops" parallelLoops
270 describe "Composed MonadError serially" $ composeWithMonadError serially
295 describe "Composed MonadError serially" $ composeWithMonadError serially
271 describe "Composed MonadError wSerially" $ composeWithMonadError wSerially
296 describe "Composed MonadError wSerially" $ composeWithMonadError wSerially