@@ -50,6 +50,18 @@ public static Task<TSource> AggregateAsync<TSource>(this IAsyncEnumerable<TSourc
5050 return AggregateCore ( source , accumulator , cancellationToken ) ;
5151 }
5252
53+ #if ! NO_DEEP_CANCELLATION
54+ public static Task < TSource > AggregateAsync < TSource > ( this IAsyncEnumerable < TSource > source , Func < TSource , TSource , CancellationToken , ValueTask < TSource > > accumulator , CancellationToken cancellationToken )
55+ {
56+ if ( source == null )
57+ throw Error . ArgumentNull ( nameof ( source ) ) ;
58+ if ( accumulator == null )
59+ throw Error . ArgumentNull ( nameof ( accumulator ) ) ;
60+
61+ return AggregateCore ( source , accumulator , cancellationToken ) ;
62+ }
63+ #endif
64+
5365 public static Task < TAccumulate > AggregateAsync < TSource , TAccumulate > ( this IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , TAccumulate > accumulator )
5466 {
5567 if ( source == null )
@@ -90,6 +102,18 @@ public static Task<TAccumulate> AggregateAsync<TSource, TAccumulate>(this IAsync
90102 return AggregateCore ( source , seed , accumulator , cancellationToken ) ;
91103 }
92104
105+ #if ! NO_DEEP_CANCELLATION
106+ public static Task < TAccumulate > AggregateAsync < TSource , TAccumulate > ( this IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , CancellationToken , ValueTask < TAccumulate > > accumulator , CancellationToken cancellationToken )
107+ {
108+ if ( source == null )
109+ throw Error . ArgumentNull ( nameof ( source ) ) ;
110+ if ( accumulator == null )
111+ throw Error . ArgumentNull ( nameof ( accumulator ) ) ;
112+
113+ return AggregateCore ( source , seed , accumulator , cancellationToken ) ;
114+ }
115+ #endif
116+
93117 public static Task < TResult > AggregateAsync < TSource , TAccumulate , TResult > ( this IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , TAccumulate > accumulator , Func < TAccumulate , TResult > resultSelector )
94118 {
95119 if ( source == null )
@@ -138,6 +162,20 @@ public static Task<TResult> AggregateAsync<TSource, TAccumulate, TResult>(this I
138162 return AggregateCore ( source , seed , accumulator , resultSelector , cancellationToken ) ;
139163 }
140164
165+ #if ! NO_DEEP_CANCELLATION
166+ public static Task < TResult > AggregateAsync < TSource , TAccumulate , TResult > ( this IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , CancellationToken , ValueTask < TAccumulate > > accumulator , Func < TAccumulate , CancellationToken , ValueTask < TResult > > resultSelector , CancellationToken cancellationToken )
167+ {
168+ if ( source == null )
169+ throw Error . ArgumentNull ( nameof ( source ) ) ;
170+ if ( accumulator == null )
171+ throw Error . ArgumentNull ( nameof ( accumulator ) ) ;
172+ if ( resultSelector == null )
173+ throw Error . ArgumentNull ( nameof ( resultSelector ) ) ;
174+
175+ return AggregateCore ( source , seed , accumulator , resultSelector , cancellationToken ) ;
176+ }
177+ #endif
178+
141179 private static async Task < TResult > AggregateCore < TSource , TAccumulate , TResult > ( IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , TAccumulate > accumulator , Func < TAccumulate , TResult > resultSelector , CancellationToken cancellationToken )
142180 {
143181 var acc = seed ;
@@ -206,6 +244,29 @@ private static async Task<TResult> AggregateCore<TSource, TResult>(IAsyncEnumera
206244 return acc ;
207245 }
208246
247+ #if ! NO_DEEP_CANCELLATION
248+ private static async Task < TResult > AggregateCore < TSource , TResult > ( IAsyncEnumerable < TSource > source , TResult seed , Func < TResult , TSource , CancellationToken , ValueTask < TResult > > accumulator , CancellationToken cancellationToken )
249+ {
250+ var acc = seed ;
251+
252+ var e = source . GetAsyncEnumerator ( cancellationToken ) ;
253+
254+ try
255+ {
256+ while ( await e . MoveNextAsync ( ) . ConfigureAwait ( false ) )
257+ {
258+ acc = await accumulator ( acc , e . Current , cancellationToken ) . ConfigureAwait ( false ) ;
259+ }
260+ }
261+ finally
262+ {
263+ await e . DisposeAsync ( ) . ConfigureAwait ( false ) ;
264+ }
265+
266+ return acc ;
267+ }
268+ #endif
269+
209270 private static async Task < TResult > AggregateCore < TSource , TAccumulate , TResult > ( IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , ValueTask < TAccumulate > > accumulator , Func < TAccumulate , ValueTask < TResult > > resultSelector , CancellationToken cancellationToken )
210271 {
211272 var acc = seed ;
@@ -227,6 +288,29 @@ private static async Task<TResult> AggregateCore<TSource, TAccumulate, TResult>(
227288 return await resultSelector ( acc ) . ConfigureAwait ( false ) ;
228289 }
229290
291+ #if ! NO_DEEP_CANCELLATION
292+ private static async Task < TResult > AggregateCore < TSource , TAccumulate , TResult > ( IAsyncEnumerable < TSource > source , TAccumulate seed , Func < TAccumulate , TSource , CancellationToken , ValueTask < TAccumulate > > accumulator , Func < TAccumulate , CancellationToken , ValueTask < TResult > > resultSelector , CancellationToken cancellationToken )
293+ {
294+ var acc = seed ;
295+
296+ var e = source . GetAsyncEnumerator ( cancellationToken ) ;
297+
298+ try
299+ {
300+ while ( await e . MoveNextAsync ( ) . ConfigureAwait ( false ) )
301+ {
302+ acc = await accumulator ( acc , e . Current , cancellationToken ) . ConfigureAwait ( false ) ;
303+ }
304+ }
305+ finally
306+ {
307+ await e . DisposeAsync ( ) . ConfigureAwait ( false ) ;
308+ }
309+
310+ return await resultSelector ( acc , cancellationToken ) . ConfigureAwait ( false ) ;
311+ }
312+ #endif
313+
230314 private static async Task < TSource > AggregateCore < TSource > ( IAsyncEnumerable < TSource > source , Func < TSource , TSource , ValueTask < TSource > > accumulator , CancellationToken cancellationToken )
231315 {
232316 var e = source . GetAsyncEnumerator ( cancellationToken ) ;
@@ -252,5 +336,33 @@ private static async Task<TSource> AggregateCore<TSource>(IAsyncEnumerable<TSour
252336 await e . DisposeAsync ( ) . ConfigureAwait ( false ) ;
253337 }
254338 }
339+
340+ #if ! NO_DEEP_CANCELLATION
341+ private static async Task < TSource > AggregateCore < TSource > ( IAsyncEnumerable < TSource > source , Func < TSource , TSource , CancellationToken , ValueTask < TSource > > accumulator , CancellationToken cancellationToken )
342+ {
343+ var e = source . GetAsyncEnumerator ( cancellationToken ) ;
344+
345+ try
346+ {
347+ if ( ! await e . MoveNextAsync ( ) . ConfigureAwait ( false ) )
348+ {
349+ throw Error . NoElements ( ) ;
350+ }
351+
352+ var acc = e . Current ;
353+
354+ while ( await e . MoveNextAsync ( ) . ConfigureAwait ( false ) )
355+ {
356+ acc = await accumulator ( acc , e . Current , cancellationToken ) . ConfigureAwait ( false ) ;
357+ }
358+
359+ return acc ;
360+ }
361+ finally
362+ {
363+ await e . DisposeAsync ( ) . ConfigureAwait ( false ) ;
364+ }
365+ }
366+ #endif
255367 }
256368}
0 commit comments