/// <summary> /// Merge one or more streams (T) into a single stream (Message{T}) interleaved in wall-clock time. /// </summary> /// <remarks>Messages are produced in the order they arrive, in wall-clock time; potentially out of originating-time order.</remarks> /// <typeparam name="T">Type of messages.</typeparam> /// <param name="inputs">Collection of homogeneous inputs.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="name">An optional name for this stream operator.</param> /// <returns>Stream of merged messages.</returns> public static IProducer <Message <T> > Merge <T>(IEnumerable <IProducer <T> > inputs, DeliveryPolicy <T> deliveryPolicy = null, string name = nameof(Merge)) { if (inputs.Count() == 0) { throw new ArgumentException("Merge requires one or more inputs."); } var merge = new Merge <T>(inputs.First().Out.Pipeline, name); foreach (var i in inputs) { i.PipeTo(merge.AddInput($"Receiver{i.Out.Id}"), deliveryPolicy); } return(merge.Out); }