
On Fri, Jun 15, 2012 at 02:26:51PM +0100, Simon Marlow wrote:
On 14/06/2012 16:10, Ross Paterson wrote:
An alternative, equivalent interface for waitEither and friends would be
waitEither :: Async a -> Async a -> IO (Either SomeException a) waitEitherThrow :: Async a -> Async a -> IO a
This might be conceptually simpler, leaving it to the user to decide whether to mark the results with Left/Right, or something else, or not. Similarly the Async now returned by waitAny and friends could be left to the user. That would leave the two sets of functions more in line.
I liked this suggestion at first, but later concluded that it isn't as nice. The problem is that to convert an 'Async a' to an 'Async (Either a b)' has to be done when you create the Async in the first place, or else you have to write some STM code to lift the result. If you're writing some STM code anyway, then there's little point in using waitEither.
The list functions have a similar issue: you have to give them the right type when you create them if you want them together in a list. Perhaps a convenient interface for the multiplexing part would be data AsyncF a = forall r. AsyncF (Async r) (r -> a) instance Functor AsyncF where fmap f (AsyncF a k) = AsyncF a (f . k) waitSTMF :: AsyncF a -> STM (Either SomeException a) waitSTMF (AsyncF a k) = fmap (fmap k) (waitSTM a)