/// <inheritdoc />
        public TInterest this[TKey key]
        {
            get
            {
                IInterestMapContracts.Indexer(this, key);

                TInterest result;
                return(this.map.TryGetValue(key, out result) ? result : this.merger.None);
            }
        }
        /// <inheritdoc />
        public void AddInterest(TKey key, TInterest interest)
        {
            IInterestMapContracts.AddInterest(this, key);

            TInterest previous = this[key];
            TInterest next     = this.merger.GetInterestByAdding(previous, interest);

            if (!this.merger.Comparer.Equals(previous, next))
            {
                this.map[key] = next;
                this.interestsChanged.OnNext(KeyValuePair.New(key, SequentialPair.New(previous, next)));
            }
        }
        /// <inheritdoc />
        public void UpdateInterests(TInterest interest, IReadOnlySet <TKey> addTo, IReadOnlySet <TKey> removeFrom)
        {
            IInterestMapContracts.UpdateInterests(this, addTo, removeFrom);

            foreach (var key in addTo)
            {
                if (!removeFrom.Contains(key))
                {
                    this.AddInterest(key, interest);
                }
            }

            foreach (var key in removeFrom)
            {
                if (!addTo.Contains(key))
                {
                    this.RemoveInterest(key, interest);
                }
            }
        }
        /// <inheritdoc />
        public void RemoveInterest(TKey key, TInterest interest)
        {
            IInterestMapContracts.RemoveInterest(this, key);

            TInterest previous = this[key];
            TInterest next     = this.merger.GetInterestByRemoving(previous, interest);

            if (!this.merger.Comparer.Equals(previous, next))
            {
                if (this.merger.Comparer.Equals(next, this.merger.None))
                {
                    this.map.Remove(key);
                }
                else
                {
                    this.map[key] = next;
                }

                this.interestsChanged.OnNext(KeyValuePair.New(key, SequentialPair.New(previous, next)));
            }
        }