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 GHCio ( stThen )
23 import Concurrent ( forkIO )
27 mergeIO :: [a] -> [a] -> IO [a]
28 nmergeIO :: [[a]] -> IO [a]
30 #ifndef __CONCURRENT_HASKELL__
32 mergeIO _ _ = return []
33 nmergeIO _ = return []
38 = newEmptyMVar >>= \ tail_node ->
39 newMVar tail_node >>= \ tail_list ->
40 newQSem max_buff_size >>= \ e ->
41 newMVar 2 >>= \ branches_running ->
45 forkIO (suckIO branches_running buff ls) >>
46 forkIO (suckIO branches_running buff rs) >>
47 takeMVar tail_node >>= \ val ->
52 = (MVar (MVar [a]), QSem)
54 suckIO :: MVar Int -> Buffer a -> [a] -> IO ()
56 suckIO branches_running buff@(tail_list,e) vs
58 [] -> takeMVar branches_running >>= \ val ->
60 takeMVar tail_list >>= \ node ->
62 putMVar tail_list node
64 putMVar branches_running (val-1)
67 takeMVar tail_list >>= \ node ->
68 newEmptyMVar >>= \ next_node ->
69 unsafeInterleavePrimIO ( ioToPrimIO $
70 takeMVar next_node >>= \ x ->
72 return x) `stThen` \ next_node_val ->
73 putMVar node (x:next_node_val) >>
74 putMVar tail_list next_node >>
75 suckIO branches_running buff xs
81 newEmptyMVar >>= \ tail_node ->
82 newMVar tail_node >>= \ tail_list ->
83 newQSem max_buff_size >>= \ e ->
84 newMVar len >>= \ branches_running ->
88 mapIO (\ x -> forkIO (suckIO branches_running buff x)) lss >>
89 takeMVar tail_node >>= \ val ->
93 mapIO f xs = accumulate (map f xs)
95 #endif {- __CONCURRENT_HASKELL__ -}