public IDisposable Subscribe(IObserver <T> observer) { if (observer == null) { throw new ArgumentNullException(nameof(observer)); } if (_error != null) { observer.OnError(_error); return(Disposable.Nop); } if (_completed) { observer.OnCompleted(); return(Disposable.Nop); } Observers.Add(observer); return(Delegate.Disposable(() => { var observers = Observers; // Could do the following to find the index of the // the observer: // // var i = observers.FindIndex(o => o == observer); // // but it would require a closure allocation. for (var i = 0; i < observers.Count; i++) { if (observers[i] == observer) { if (_shouldDeleteObserver) { observers[i] = null; } else { observers.RemoveAt(i); } break; } } })); }
public IDisposable Subscribe(IObserver <T> observer) { if (observer == null) { throw new ArgumentNullException(nameof(observer)); } if (_error != null) { observer.OnError(_error); return(Disposable.Nop); } if (_completed) { observer.OnCompleted(); return(Disposable.Nop); } Observers.Add(observer); return(Delegate.Disposable(() => Observers.Remove(observer))); }
/// <summary> /// Subscribes an element handler and a completion handler to an /// observable sequence. /// </summary> /// <typeparam name="T">Type of elements in <paramref name="source"/>.</typeparam> /// <param name="source">Observable sequence to subscribe to.</param> /// <param name="onNext"> /// Action to invoke for each element in <paramref name="source"/>.</param> /// <param name="onError"> /// Action to invoke upon exceptional termination of the /// <paramref name="source"/>.</param> /// <param name="onCompleted"> /// Action to invoke upon graceful termination of <paramref name="source"/>.</param> /// <returns>The subscription, which when disposed, will unsubscribe /// from <paramref name="source"/>.</returns> public static IDisposable Subscribe <T>(this IObservable <T> source, Action <T> onNext, Action <Exception>?onError = null, Action?onCompleted = null) => source == null ? throw new ArgumentNullException(nameof(source)) : source.Subscribe(Delegate.Observer(onNext, onError, onCompleted));