<br><br>
<div><span class="gmail_quote">On 11/27/07, <b class="gmail_sendername">Matthew Brecknell</b> <<a href="mailto:haskell@brecknell.org">haskell@brecknell.org</a>> wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">> wait_first :: [Wait a] -> IO (a, [Wait a])<br>> wait_first [] = error "wait_first: nothing to wait for"
<br>> wait_first ws = atomically (do_wait ws) where<br>> do_wait [] = retry<br>> do_wait (Wait w : ws) = do<br>> r <- readTVar w<br>> case r of<br>> Nothing -> fmap (second (Wait w:)) (do_wait ws)
<br>> Just s -> return (s,ws)</blockquote>
<div> </div>
<div>Interesting, although this seems like a perfect use for "orelse":</div>
<div> </div>
<div>> wait_stm :: Wait a -> STM a</div>
<div>> wait_stm (Wait w) = readTVar w >>= maybe retry return</div>
<div> </div>
<div>> wait :: Wait a -> IO a</div>
<div>> wait w = atomically $ wait_stm w</div>
<div> </div>
<div>> wait_first :: [Wait a] -> IO (a, [Wait a])</div>
<div>> wait_first [] = error "wait_first: nothing to wait for"</div>
<div>> wait_first ws = atomically (do_wait ws) where</div>
<div>> do_wait [] = retry</div>
<div>> do_wait (w : ws) = do</div>
<div>> r <- wait_stm w</div>
<div>> return (r, ws)</div>
<div>> `orelse` fmap (second (w:)) (do_wait ws)</div>
<div> </div><br> </div>