2 % (c) The GRASP/AQUA Project, Glasgow University, 1995
4 \section[Merge]{Mergeing streams}
6 Avoiding the loss of ref. transparency by attaching the merge to the
13 mergeIO, -- :: [a] -> [a] -> IO [a]
14 nmergeIO -- :: [[a]] -> IO [a]
23 mergeIO :: [a] -> [a] -> IO [a]
24 nmergeIO :: [[a]] -> IO [a]
26 #ifndef __CONCURRENT_HASKELL__
28 mergeIO _ _ = return []
29 nmergeIO _ = return []
34 = newEmptyMVar >>= \ tail_node ->
35 newMVar tail_node >>= \ tail_list ->
36 newQSem max_buff_size >>= \ e ->
37 newMVar 2 >>= \ branches_running ->
41 forkIO (suckIO branches_running buff ls) >>
42 forkIO (suckIO branches_running buff rs) >>
43 takeMVar tail_node >>= \ val ->
48 = (MVar (MVar [a]), QSem)
50 suckIO :: MVar Int -> Buffer a -> [a] -> IO ()
52 suckIO branches_running buff@(tail_list,e) vs
54 [] -> takeMVar branches_running >>= \ val ->
56 takeMVar tail_list >>= \ node ->
58 putMVar tail_list node
60 putMVar branches_running (val-1)
63 takeMVar tail_list >>= \ node ->
64 newEmptyMVar >>= \ next_node ->
66 takeMVar next_node >>= \ x ->
68 return x) >>= \ next_node_val ->
69 putMVar node (x:next_node_val) >>
70 putMVar tail_list next_node >>
71 suckIO branches_running buff xs
77 newEmptyMVar >>= \ tail_node ->
78 newMVar tail_node >>= \ tail_list ->
79 newQSem max_buff_size >>= \ e ->
80 newMVar len >>= \ branches_running ->
84 mapIO (\ x -> forkIO (suckIO branches_running buff x)) lss >>
85 takeMVar tail_node >>= \ val ->
89 mapIO f xs = accumulate (map f xs)
91 #endif {- __CONCURRENT_HASKELL__ -}