/// <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))); } }