// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. namespace System.Reactive { internal class NopObserver : IObserver { public static readonly IObserver Instance = new NopObserver(); public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(T value) { } } internal class DoneObserver : IObserver { public static readonly IObserver Completed = new DoneObserver(); public Exception Exception { get; set; } public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(T value) { } } internal class DisposedObserver : IObserver { public static readonly IObserver Instance = new DisposedObserver(); public void OnCompleted() { throw new ObjectDisposedException(""); } public void OnError(Exception error) { throw new ObjectDisposedException(""); } public void OnNext(T value) { throw new ObjectDisposedException(""); } } internal class Observer : IObserver { private readonly ImmutableList> _observers; public Observer(ImmutableList> observers) { _observers = observers; } public void OnCompleted() { foreach (var observer in _observers.Data) observer.OnCompleted(); } public void OnError(Exception error) { foreach (var observer in _observers.Data) observer.OnError(error); } public void OnNext(T value) { foreach (var observer in _observers.Data) observer.OnNext(value); } internal IObserver Add(IObserver observer) { return new Observer(_observers.Add(observer)); } internal IObserver Remove(IObserver observer) { var i = Array.IndexOf(_observers.Data, observer); if (i < 0) return this; if (_observers.Data.Length == 2) { return _observers.Data[1 - i]; } else { return new Observer(_observers.Remove(observer)); } } } }