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.
134 lines
2.9 KiB
134 lines
2.9 KiB
8 months ago
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Text;
|
||
|
|
||
|
namespace UniRx.InternalUtil
|
||
|
{
|
||
|
public class ListObserver<T> : IObserver<T>
|
||
|
{
|
||
|
private readonly ImmutableList<IObserver<T>> _observers;
|
||
|
|
||
|
public ListObserver(ImmutableList<IObserver<T>> observers)
|
||
|
{
|
||
|
_observers = observers;
|
||
|
}
|
||
|
|
||
|
public void OnCompleted()
|
||
|
{
|
||
|
var targetObservers = _observers.Data;
|
||
|
for (int i = 0; i < targetObservers.Length; i++)
|
||
|
{
|
||
|
targetObservers[i].OnCompleted();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void OnError(Exception error)
|
||
|
{
|
||
|
var targetObservers = _observers.Data;
|
||
|
for (int i = 0; i < targetObservers.Length; i++)
|
||
|
{
|
||
|
targetObservers[i].OnError(error);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void OnNext(T value)
|
||
|
{
|
||
|
var targetObservers = _observers.Data;
|
||
|
for (int i = 0; i < targetObservers.Length; i++)
|
||
|
{
|
||
|
targetObservers[i].OnNext(value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal IObserver<T> Add(IObserver<T> observer)
|
||
|
{
|
||
|
return new ListObserver<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 ListObserver<T>(_observers.Remove(observer));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class EmptyObserver<T> : IObserver<T>
|
||
|
{
|
||
|
public static readonly EmptyObserver<T> Instance = new EmptyObserver<T>();
|
||
|
|
||
|
EmptyObserver()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public void OnCompleted()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public void OnError(Exception error)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public void OnNext(T value)
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class ThrowObserver<T> : IObserver<T>
|
||
|
{
|
||
|
public static readonly ThrowObserver<T> Instance = new ThrowObserver<T>();
|
||
|
|
||
|
ThrowObserver()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public void OnCompleted()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
public void OnError(Exception error)
|
||
|
{
|
||
|
error.Throw();
|
||
|
}
|
||
|
|
||
|
public void OnNext(T value)
|
||
|
{
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class DisposedObserver<T> : IObserver<T>
|
||
|
{
|
||
|
public static readonly DisposedObserver<T> Instance = new DisposedObserver<T>();
|
||
|
|
||
|
DisposedObserver()
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
public void OnCompleted()
|
||
|
{
|
||
|
throw new ObjectDisposedException("");
|
||
|
}
|
||
|
|
||
|
public void OnError(Exception error)
|
||
|
{
|
||
|
throw new ObjectDisposedException("");
|
||
|
}
|
||
|
|
||
|
public void OnNext(T value)
|
||
|
{
|
||
|
throw new ObjectDisposedException("");
|
||
|
}
|
||
|
}
|
||
|
}
|