@@ -23,6 +23,8 @@ module Asyncly.AsyncT
2323 , toList
2424 , each
2525 , for
26+ , interleave
27+ , (<=>)
2628-- , async
2729-- , makeAsync
2830 )
@@ -122,6 +124,19 @@ instance Monad m => Monoid (AsyncT m a) where
122124 yield a c (Just r) = yld a c (Just (mappend r m2))
123125 in m1 ctx stop yield
124126
127+-- | interleaves the results of two AsyncT computations
128+interleave :: AsyncT m a -> AsyncT m a -> AsyncT m a
129+interleave m1 m2 = AsyncT $ \ctx stp yld -> do
130+ let stop = (runAsyncT m2) ctx stp yld
131+ yield a c Nothing = yld a c (Just m2)
132+ yield a c (Just r) = yld a c (Just (interleave m2 r))
133+ (runAsyncT m1) ctx stop yield
134+
135+infixr 5 <=>
136+
137+(<=>) :: AsyncT m a -> AsyncT m a -> AsyncT m a
138+(<=>) = interleave
139+
125140-- We do not use bind for parallelism. That is, we do not start each iteration
126141-- of the list in parallel. That will introduce too much uncontrolled
127142-- parallelism. Instead we control parallelism using <|>, it is used for