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
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(""); |
|
} |
|
} |
|
} |