// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT License. // See the LICENSE file in the project root for more information. using System.Collections; using System.Collections.Generic; using System.Linq; namespace System.Reactive { internal sealed class Lookup : ILookup { private readonly Dictionary> d; public Lookup(IEqualityComparer comparer) { d = new Dictionary>(comparer); } public void Add(K key, E element) { if (!d.TryGetValue(key, out var list)) d[key] = list = new List(); list.Add(element); } public bool Contains(K key) => d.ContainsKey(key); public int Count => d.Count; public IEnumerable this[K key] { get { if (!d.TryGetValue(key, out var list)) return Enumerable.Empty(); return Hide(list); } } private IEnumerable Hide(List elements) { foreach (var x in elements) yield return x; } public IEnumerator> GetEnumerator() { foreach (var kv in d) yield return new Grouping(kv); } private sealed class Grouping : IGrouping { private readonly KeyValuePair> kv; public Grouping(KeyValuePair> kv) { this.kv = kv; } public K Key => kv.Key; public IEnumerator GetEnumerator() => kv.Value.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } }