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]
22 mergeIO :: [a] -> [a] -> IO [a]
23 nmergeIO :: [[a]] -> IO [a]
25 #ifndef __CONCURRENT_HASKELL__
27 mergeIO _ _ = return []
28 nmergeIO _ = return []
33 = newEmptyMVar >>= \ tail_node ->
34 newMVar tail_node >>= \ tail_list ->
35 newQSem max_buff_size >>= \ e ->
36 newMVar 2 >>= \ branches_running ->
40 forkIO (suckIO branches_running buff ls) >>
41 forkIO (suckIO branches_running buff rs) >>
42 takeMVar tail_node >>= \ val ->
47 = (MVar (MVar [a]), QSem)
49 suckIO :: MVar Int -> Buffer a -> [a] -> IO ()
51 suckIO branches_running buff@(tail_list,e) vs
53 [] -> takeMVar branches_running >>= \ val ->
55 takeMVar tail_list >>= \ node ->
57 putMVar tail_list node
59 putMVar branches_running (val-1)
62 takeMVar tail_list >>= \ node ->
63 newEmptyMVar >>= \ next_node ->
64 unsafeInterleavePrimIO ( ioToPrimIO $
65 takeMVar next_node >>= \ x ->
67 return x) `stThen` \ next_node_val ->
68 putMVar node (x:next_node_val) >>
69 putMVar tail_list next_node >>
70 suckIO branches_running buff xs
76 newEmptyMVar >>= \ tail_node ->
77 newMVar tail_node >>= \ tail_list ->
78 newQSem max_buff_size >>= \ e ->
79 newMVar len >>= \ branches_running ->
83 mapIO (\ x -> forkIO (suckIO branches_running buff x)) lss >>
84 takeMVar tail_node >>= \ val ->
88 mapIO f xs = accumulate (map f xs)
90 #endif {- __CONCURRENT_HASKELL__ -}