/// <summary> /// Aggregate stream values. /// </summary> /// <typeparam name="TIn">Type of source stream.</typeparam> /// <typeparam name="TOut">Type of output stream.</typeparam> /// <param name="source">Source stream.</param> /// <param name="initialState">The initial state.</param> /// <param name="aggregator">The aggregator function.</param> /// <param name="deliveryPolicy">An optional delivery policy.</param> /// <param name="name">An optional name for this stream operator.</param> /// <returns>Output stream.</returns> public static IProducer <TOut> Aggregate <TIn, TOut>( this IProducer <TIn> source, TOut initialState, Func <TOut, TIn, TOut> aggregator, DeliveryPolicy <TIn> deliveryPolicy = null, string name = nameof(Aggregate)) => source.Aggregate <TOut, TIn, TOut>( initialState, (state, input, envelope, emitter) => { var newState = aggregator(state, input); emitter.Post(newState, envelope.OriginatingTime); return(newState); }, deliveryPolicy, name);