public static IEnumerableAsync <T> SelectMany <M, T>(this IEnumerableAsync <M> input, Action <M, Queue <T> > selector, Action <Queue <T> > finalizer = null) { var buffer = new Queue <T> (); return(EnumerableAsync.Produce <T>(async yieldAsync => { await input.ForEach(async m => { selector(m, buffer); while (buffer.Count > 0) { await yieldAsync.YieldAsync(buffer.Dequeue()); } return true; }); if (finalizer != null) { finalizer(buffer); while (buffer.Count > 0) { await yieldAsync.YieldAsync(buffer.Dequeue()); } } })); }
public async Task EnumerableAsyncProduceTest() { int sequenceLen = 10000; var producer = EnumerableAsync.Produce <int>(async yielder => { for (var i = 0; i < sequenceLen; ++i) { await yielder.YieldAsync(i); await Task.Yield(); } }); var multiplexed = producer.Multiplex(); var list1 = multiplexed.Select(async i => { await Task.Yield(); return(i * 10); }).ToList(); var list2 = multiplexed.Select(async i => { await Task.Yield(); return(i * 100); }).ToList(); await Task.WhenAll(multiplexed.Open(), list1, list2); for (int i = 0; i < sequenceLen; ++i) { Assert.AreEqual(i * 10, list1.Result[i]); Assert.AreEqual(i * 100, list2.Result[i]); } }
public static IEnumerableAsync <T> Select <T, M>(this IEnumerableAsync <M[]> input, Func <M, T> selector) { return(EnumerableAsync.Produce <T>(yieldAsync => input.ForEach(async messages => { foreach (var evt in messages.Select(selector)) { await yieldAsync.YieldAsync(evt); } return true; }) )); }
public static IEnumerableAsync <T> SelectMany <M, T>( this IEnumerableAsync <M[]> input, Action <M, Queue <T> > selector, Action <Queue <T> > finalSelector = null, Action <T> resultPostprocessor = null) { var buffer = new Queue <T> (); Func <T, T> postprocessor; if (resultPostprocessor != null) { postprocessor = x => { resultPostprocessor(x); return(x); } } ; else { postprocessor = x => x; } return(EnumerableAsync.Produce <T>(async yieldAsync => { await input.ForEach(async messages => { foreach (var m in messages) { selector(m, buffer); while (buffer.Count > 0) { await yieldAsync.YieldAsync(postprocessor(buffer.Dequeue())); } } return true; }); if (finalSelector != null) { finalSelector(buffer); while (buffer.Count > 0) { await yieldAsync.YieldAsync(postprocessor(buffer.Dequeue())); } } })); }
public static IEnumerableAsync <T> Select <T, M>(this IEnumerableAsync <M[]> input, Func <M, IEnumerable <T> > selector, Func <IEnumerable <T> > finalizer) { return(EnumerableAsync.Produce <T>(async yieldAsync => { await input.ForEach(async messages => { foreach (var evt in messages.SelectMany(selector)) { await yieldAsync.YieldAsync(evt); } return true; }); if (finalizer != null) { foreach (var evt in finalizer()) { await yieldAsync.YieldAsync(evt); } } })); }