1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.
namespace System.Reactive
{
class NopObserver<T> : IObserver<T>
{
public static readonly IObserver<T> Instance = new NopObserver<T>();
public void OnCompleted()
{
}
public void OnError(Exception error)
{
}
public void OnNext(T value)
{
}
}
class DoneObserver<T> : IObserver<T>
{
public static readonly IObserver<T> Completed = new DoneObserver<T>();
public Exception Exception { get; set; }
public void OnCompleted()
{
}
public void OnError(Exception error)
{
}
public void OnNext(T value)
{
}
}
class DisposedObserver<T> : IObserver<T>
{
public static readonly IObserver<T> Instance = new DisposedObserver<T>();
public void OnCompleted()
{
throw new ObjectDisposedException("");
}
public void OnError(Exception error)
{
throw new ObjectDisposedException("");
}
public void OnNext(T value)
{
throw new ObjectDisposedException("");
}
}
class Observer<T> : IObserver<T>
{
private readonly ImmutableList<IObserver<T>> _observers;
public Observer(ImmutableList<IObserver<T>> 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<T> Add(IObserver<T> observer)
{
return new Observer<T>(_observers.Add(observer));
}
internal IObserver<T> Remove(IObserver<T> 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<T>(_observers.Remove(observer));
}
}
}
}
|