using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Wabbajack.Common.CSP { public static class CSPExtensions { public static async Task OntoChannel(this IEnumerable coll, IChannel chan) { foreach (var val in coll) { if (!await chan.Put(val)) break; } } /// /// Turns a IEnumerable collection into a channel. Note, computation of the enumerable will happen inside /// the lock of the channel, so try to keep the work of the enumerable light. /// /// /// Collection to spool out of the channel. /// public static IChannel ToChannel(this IEnumerable coll) { return Channel.Create(coll.GetEnumerator()); } public static async Task> TakeAll(this IChannel chan) { List acc = new List(); while (true) { var (open, val) = await chan.Take(); if (!open) break; acc.Add(val); } return acc; } } }