/// <summary> /// Add an observer to the observer collection /// </summary> /// <param name="observer"></param> public virtual void Register(ICollectionObserver <T> observer) { if (Observers.Contains(observer)) { return; } Observers.Add(observer); }
/// <summary> /// Remove an observer from the observer collection /// </summary> /// <param name="observer"></param> public virtual void Unregister(ICollectionObserver <T> observer) { if (!Observers.Contains(observer)) { return; } Observers.Remove(observer); }
private bool TryGetDisposable(ICollectionObserver <T> observer, out IDisposable disposable) { var index = observers.FindIndex(tuple => tuple.Item1 == observer); if (0 > index) { disposable = Disposable.Empty; return(false); } disposable = observers[index].Item2; return(true); }
private void RemoveObserver(ICollectionObserver <T> observer) { IDisposable disposable; lock (gate) { var index = observers.FindIndex(tuple => tuple.Item1 == observer); if (0 > index) { return; } disposable = observers[index].Item2; observers.RemoveAt(index); } disposable.Dispose(); }
public IDisposable Subscribe(ICollectionObserver <T> observer) { if (null == observer) { throw new ArgumentNullException(nameof(observer)); } IDisposable disposable; lock (gate) { if (false == TryGetDisposable(observer, out disposable)) { disposable = Disposable.Create(observer, RemoveObserver); observers.Add(new Tuple <ICollectionObserver <T>, IDisposable>(observer, disposable)); } } return(disposable); }