using System; using System.Collections.Generic; using System.Text; namespace UniRx.InternalUtil { public class ListObserver : IObserver { private readonly ImmutableList> _observers; public ListObserver(ImmutableList> 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 Add(IObserver observer) { return new ListObserver(_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 ListObserver(_observers.Remove(observer)); } } } public class EmptyObserver : IObserver { public static readonly EmptyObserver Instance = new EmptyObserver(); EmptyObserver() { } public void OnCompleted() { } public void OnError(Exception error) { } public void OnNext(T value) { } } public class ThrowObserver : IObserver { public static readonly ThrowObserver Instance = new ThrowObserver(); ThrowObserver() { } public void OnCompleted() { } public void OnError(Exception error) { error.Throw(); } public void OnNext(T value) { } } public class DisposedObserver : IObserver { public static readonly DisposedObserver Instance = new DisposedObserver(); DisposedObserver() { } public void OnCompleted() { throw new ObjectDisposedException(""); } public void OnError(Exception error) { throw new ObjectDisposedException(""); } public void OnNext(T value) { throw new ObjectDisposedException(""); } } }