3 % (c) The GRASP/AQUA Project, Glasgow University, 1995
5 \section[Merge]{Mergeing streams}
7 Avoiding the loss of ref. transparency by attaching the merge to the
15 mergeIO, --:: [a] -> [a] -> IO [a]
16 nmergeIO --:: [[a]] -> IO [a]
22 import Concurrent ( forkIO )
26 mergeIO :: [a] -> [a] -> IO [a]
27 nmergeIO :: [[a]] -> IO [a]
29 #ifndef __CONCURRENT_HASKELL__
31 mergeIO _ _ = return []
32 nmergeIO _ = return []
37 = newEmptyMVar >>= \ tail_node ->
38 newMVar tail_node >>= \ tail_list ->
39 newQSem max_buff_size >>= \ e ->
40 newMVar 2 >>= \ branches_running ->
44 forkIO (suckIO branches_running buff ls) >>
45 forkIO (suckIO branches_running buff rs) >>
46 takeMVar tail_node >>= \ val ->
51 = (MVar (MVar [a]), QSem)
53 suckIO :: MVar Int -> Buffer a -> [a] -> IO ()
55 suckIO branches_running buff@(tail_list,e) vs
57 [] -> takeMVar branches_running >>= \ val ->
59 takeMVar tail_list >>= \ node ->
61 putMVar tail_list node
63 putMVar branches_running (val-1)
66 takeMVar tail_list >>= \ node ->
67 newEmptyMVar >>= \ next_node ->
68 unsafeInterleavePrimIO (
69 takeMVar next_node `thenPrimIO` \ (Right x) ->
70 signalQSem e `seqPrimIO`
71 returnPrimIO x) `thenPrimIO` \ next_node_val ->
72 putMVar node (x:next_node_val) >>
73 putMVar tail_list next_node >>
74 suckIO branches_running buff xs
80 newEmptyMVar >>= \ tail_node ->
81 newMVar tail_node >>= \ tail_list ->
82 newQSem max_buff_size >>= \ e ->
83 newMVar len >>= \ branches_running ->
87 mapIO (\ x -> forkIO (suckIO branches_running buff x)) lss >>
88 takeMVar tail_node >>= \ val ->
92 mapIO f xs = accumulate (map f xs)
94 #endif {- __CONCURRENT_HASKELL__ -}