// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. using System.Collections.Generic; using System.Runtime.CompilerServices; namespace System.Threading.Tasks { // This type is only public for ref assms < .NET Standard 2.1 and implementations #if !BCL_HAS_CONFIGUREAWAIT || !REFERENCE_ASSEMBLY public #else internal #endif static class AsyncEnumerableExtensions { #if !BCL_HAS_CONFIGUREAWAIT // https://github.com/dotnet/coreclr/pull/21939 /// Configures how awaits on the tasks returned from an async disposable will be performed. /// The source async disposable. /// Whether to capture and marshal back to the current context. /// The configured async disposable. public static ConfiguredAsyncDisposable ConfigureAwait(this IAsyncDisposable source, bool continueOnCapturedContext) => new ConfiguredAsyncDisposable(source, continueOnCapturedContext); /// Configures how awaits on the tasks returned from an async iteration will be performed. /// The type of the objects being iterated. /// The source enumerable being iterated. /// Whether to capture and marshal back to the current context. /// The configured enumerable. public static ConfiguredCancelableAsyncEnumerable ConfigureAwait( this IAsyncEnumerable source, bool continueOnCapturedContext) => new ConfiguredCancelableAsyncEnumerable(source, continueOnCapturedContext, cancellationToken: default); /// Sets the to be passed to when iterating. /// The type of the objects being iterated. /// The source enumerable being iterated. /// The to use. /// The configured enumerable. public static ConfiguredCancelableAsyncEnumerable WithCancellation( this IAsyncEnumerable source, CancellationToken cancellationToken) => new ConfiguredCancelableAsyncEnumerable(source, continueOnCapturedContext: true, cancellationToken); #else // we need to carry an impl that delegates to the BCL version of these in the lib // They won't be in the ref /// Configures how awaits on the tasks returned from an async disposable will be performed. /// The source async disposable. /// Whether to capture and marshal back to the current context. /// The configured async disposable. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredAsyncDisposable ConfigureAwait(this IAsyncDisposable source, bool continueOnCapturedContext) => TaskExtensions.ConfigureAwait(source, continueOnCapturedContext); /// Configures how awaits on the tasks returned from an async iteration will be performed. /// The type of the objects being iterated. /// The source enumerable being iterated. /// Whether to capture and marshal back to the current context. /// The configured enumerable. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredCancelableAsyncEnumerable ConfigureAwait( this IAsyncEnumerable source, bool continueOnCapturedContext) => TaskExtensions.ConfigureAwait(source, continueOnCapturedContext); /// Sets the to be passed to when iterating. /// The type of the objects being iterated. /// The source enumerable being iterated. /// The to use. /// The configured enumerable. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ConfiguredCancelableAsyncEnumerable WithCancellation( this IAsyncEnumerable source, CancellationToken cancellationToken) => TaskExtensions.WithCancellation(source, cancellationToken); #endif } }