// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. using System.Reactive.Disposables; using System.Threading.Tasks; namespace System.Reactive.Linq { public partial class AsyncObservable { public static IAsyncObservable Finally(this IAsyncObservable source, Action finallyAction) { if (source == null) throw new ArgumentNullException(nameof(source)); if (finallyAction == null) throw new ArgumentNullException(nameof(finallyAction)); return Create( source, finallyAction, static async (source, finallyAction, observer) => { var subscription = await source.SubscribeSafeAsync(observer).ConfigureAwait(false); return AsyncDisposable.Create(async () => { try { await subscription.DisposeAsync().ConfigureAwait(false); } finally { finallyAction(); } }); }); } public static IAsyncObservable Finally(this IAsyncObservable source, Func finallyAction) { if (source == null) throw new ArgumentNullException(nameof(source)); if (finallyAction == null) throw new ArgumentNullException(nameof(finallyAction)); return Create( source, finallyAction, static async (source, finallyAction, observer) => { var subscription = await source.SubscribeSafeAsync(observer).ConfigureAwait(false); return AsyncDisposable.Create(async () => { try { await subscription.DisposeAsync().ConfigureAwait(false); } finally { await finallyAction().ConfigureAwait(false); } }); }); } } }