Exemple #1
0
        /// <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);
        }