// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System; namespace System.Reactive { // // See AutoDetachObserver.cs for more information on the safeguarding requirement and // its implementation aspects. // class SafeObserver : IObserver { private readonly IObserver _observer; private readonly IDisposable _disposable; public static IObserver Create(IObserver observer, IDisposable disposable) { var a = observer as AnonymousObserver; if (a != null) return a.MakeSafe(disposable); else return new SafeObserver(observer, disposable); } private SafeObserver(IObserver observer, IDisposable disposable) { _observer = observer; _disposable = disposable; } public void OnNext(TSource value) { var __noError = false; try { _observer.OnNext(value); __noError = true; } finally { if (!__noError) _disposable.Dispose(); } } public void OnError(Exception error) { try { _observer.OnError(error); } finally { _disposable.Dispose(); } } public void OnCompleted() { try { _observer.OnCompleted(); } finally { _disposable.Dispose(); } } } }