On 11/27/07, Matthew Brecknell <[EMAIL PROTECTED]> wrote:
>
> > wait_first :: [Wait a] -> IO (a, [Wait a])
> > wait_first [] = error "wait_first: nothing to wait for"
> > wait_first ws = atomically (do_wait ws) where
> >   do_wait [] = retry
> >   do_wait (Wait w : ws) = do
> >     r <- readTVar w
> >     case r of
> >       Nothing -> fmap (second (Wait w:)) (do_wait ws)
> >       Just s -> return (s,ws)


Interesting, although this seems like a perfect use for "orelse":

> wait_stm :: Wait a -> STM a
> wait_stm (Wait w) = readTVar w >>= maybe retry return

> wait :: Wait a -> IO a
> wait w = atomically $ wait_stm w

> wait_first :: [Wait a] -> IO (a, [Wait a])
> wait_first [] = error "wait_first: nothing to wait for"
> wait_first ws = atomically (do_wait ws) where
>    do_wait [] = retry
>    do_wait (w : ws) = do
>        r <- wait_stm w
>        return (r, ws)
>      `orelse` fmap (second (w:)) (do_wait ws)
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to