On Tue, Jun 15, 2004 at 06:29:59PM -0400, S. Alexander Jacobson wrote:
> I'd like a function that blocks until data is
> available on one of two channels and then returns
> that data wrapped in an Either.  Here is my naive
> implementation:
> 
>   readEitherChan::Chan a -> Chan b -> Either a b
>   readEitherChan a b =
>       do
>       var <- newEmptyMVar
>       forkIO (readChan a >>= putMVar var . Left)
>       forkIO (readChan b >>= putMVar var . Right)
>       val <- readMVar
>       return val
> 
>   eitherChan a b left right = readEitherChan a b >>= either left right
> 
> But creating an MVar and starting two threads
> feels like a lot of overhead for a simple
> operation.

You can also loose some elements from both channels. I think it would be
safer to create once new Chan (Either a b), and then read from it.

    createEitherChan :: Chan a -> Chan b -> IO (Chan (Either a b))
    createEitherChan a b = do
        ab <- newChan
        forkIO (sequence_ (repeat (readChan a >>= writeChan ab . Left)))
        forkIO (sequence_ (repeat (readChan b >>= writeChan ab . Right)))
        return ab

Best regards,
Tom

-- 
.signature: Too many levels of symbolic links
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to