/// <summary>
 ///
 /// </summary>
 /// <param name="stream"></param>
 /// <param name="aggregate"></param>
 public AggregateBStream(
     TumblingWindowBStream <TPayload> stream,
     IAggregate <TPayload, TAggState, TResult> aggregate
     ) : base(stream, stream.Period, stream.Offset)
 {
     Aggregate  = aggregate;
     Initialize = Aggregate.InitialState().Compile();
     Acc        = Aggregate.Accumulate().Compile();
     Res        = Aggregate.ComputeResult().Compile();
     Deacc      = Aggregate.Deaccumulate().Compile();
     Diff       = Aggregate.Difference().Compile();
 }
        /// <summary>
        ///
        /// </summary>
        /// <param name="source"></param>
        /// <param name="aggregate"></param>
        /// <typeparam name="TPayload"></typeparam>
        /// <typeparam name="TAggState"></typeparam>
        /// <typeparam name="TResult"></typeparam>
        /// <returns></returns>
        public static BStreamable <TResult> Aggregate <TPayload, TAggState, TResult>(
            this TumblingWindowBStream <TPayload> source,
            Func <Window <Empty, TPayload>, IAggregate <TPayload, TAggState, TResult> > aggregate
            )
        {
            Invariant.IsNotNull(source, nameof(source));
            Invariant.IsNotNull(aggregate, nameof(aggregate));
            var p = new StreamProperties <Empty, TPayload>(
                false, true, source.Period, true, source.Period, source.Offset,
                false, true, true, true,
                EqualityComparerExpression <Empty> .Default, EqualityComparerExpression <TPayload> .Default,
                ComparerExpression <Empty> .Default, ComparerExpression <TPayload> .Default, null, null, null
                );

            return(new AggregateBStream <TPayload, TAggState, TResult>(
                       source, aggregate(new Window <Empty, TPayload>(p))
                       ));
        }