You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.3 KiB
52 lines
1.3 KiB
5 years ago
|
// Needed for NET40
|
||
|
#if !NET_4_6
|
||
|
using System;
|
||
|
using LinqInternal.Collections.ThreadSafe;
|
||
|
using LinqInternal.Threading;
|
||
|
using LinqInternal.Threading.Needles;
|
||
|
|
||
|
namespace LinqInternal.Collections
|
||
|
{
|
||
|
[Serializable]
|
||
|
internal sealed class ProxyObservable<T> : IObservable<T>, IObserver<T>, IProxyObservable<T>
|
||
|
{
|
||
|
private readonly SafeSet<Needle<IObserver<T>>> _observers;
|
||
|
|
||
|
public ProxyObservable()
|
||
|
{
|
||
|
_observers = new SafeSet<Needle<IObserver<T>>>();
|
||
|
}
|
||
|
|
||
|
public void OnCompleted()
|
||
|
{
|
||
|
foreach (var item in _observers)
|
||
|
{
|
||
|
item.Value.OnCompleted();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void OnError(Exception error)
|
||
|
{
|
||
|
foreach (var item in _observers)
|
||
|
{
|
||
|
item.Value.OnError(error);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void OnNext(T value)
|
||
|
{
|
||
|
foreach (var item in _observers)
|
||
|
{
|
||
|
item.Value.OnNext(value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public IDisposable Subscribe(IObserver<T> observer)
|
||
|
{
|
||
|
var needle = new Needle<IObserver<T>>(observer);
|
||
|
_observers.AddNew(needle);
|
||
|
return Disposable.Create(() => _observers.Remove(needle));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|