Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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();
        }
Esempio n. 5
0
        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);
        }