/// <summary> /// Zip one or more streams (T) into a single stream while ensuring delivery in originating time order. /// </summary> /// <remarks>Messages are produced in originating-time order; potentially delayed in wall-clock time. /// If multiple messages arrive with the same originating time, they are added in the output array in /// the order of stream ids.</remarks> /// <typeparam name="T">Type of messages.</typeparam> /// <param name="inputs">Collection of input streams to zip.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="name">An optional name for this stream operator.</param> /// <returns>Stream of zipped messages.</returns> public static IProducer <T[]> Zip <T>(IEnumerable <IProducer <T> > inputs, DeliveryPolicy <T> deliveryPolicy = null, string name = nameof(Zip)) { if (inputs.Count() == 0) { throw new ArgumentException($"{nameof(Zip)} requires one or more inputs."); } var zip = new Zip <T>(inputs.First().Out.Pipeline, name); foreach (var i in inputs) { i.PipeTo(zip.AddInput($"Receiver{i.Out.Id}"), deliveryPolicy); } return(zip.Out); }