[Haskell-cafe] readEitherChan

Tomasz Zielonka t.zielonka at students.mimuw.edu.pl
Wed Jun 16 03:17:09 EDT 2004


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


More information about the Haskell-Cafe mailing list