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]
19 import UnsafeST ( unsafeInterleavePrimIO )
24 mergeIO :: [a] -> [a] -> IO [a]
25 nmergeIO :: [[a]] -> IO [a]
27 #ifndef __CONCURRENT_HASKELL__
29 mergeIO _ _ = return []
30 nmergeIO _ = return []
35 = newEmptyMVar >>= \ tail_node ->
36 newMVar tail_node >>= \ tail_list ->
37 newQSem max_buff_size >>= \ e ->
38 newMVar 2 >>= \ branches_running ->
42 forkIO (suckIO branches_running buff ls) >>
43 forkIO (suckIO branches_running buff rs) >>
44 takeMVar tail_node >>= \ val ->
49 = (MVar (MVar [a]), QSem)
51 suckIO :: MVar Int -> Buffer a -> [a] -> IO ()
53 suckIO branches_running buff@(tail_list,e) vs
55 [] -> takeMVar branches_running >>= \ val ->
57 takeMVar tail_list >>= \ node ->
59 putMVar tail_list node
61 putMVar branches_running (val-1)
64 takeMVar tail_list >>= \ node ->
65 newEmptyMVar >>= \ next_node ->
66 unsafeInterleavePrimIO ( ioToPrimIO $
67 takeMVar next_node >>= \ x ->
69 return x) `thenIO_Prim` \ next_node_val ->
70 putMVar node (x:next_node_val) >>
71 putMVar tail_list next_node >>
72 suckIO branches_running buff xs
78 newEmptyMVar >>= \ tail_node ->
79 newMVar tail_node >>= \ tail_list ->
80 newQSem max_buff_size >>= \ e ->
81 newMVar len >>= \ branches_running ->
85 mapIO (\ x -> forkIO (suckIO branches_running buff x)) lss >>
86 takeMVar tail_node >>= \ val ->
90 mapIO f xs = accumulate (map f xs)
92 #endif {- __CONCURRENT_HASKELL__ -}