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