/// <summary> /// TBD /// </summary> /// <param name="allowed">TBD</param> /// <param name="other">TBD</param> /// <returns>TBD</returns> public Reachability Merge(IImmutableSet <UniqueAddress> allowed, Reachability other) { var recordBuilder = ImmutableList.CreateBuilder <Record>(); //TODO: Size hint somehow? var newVersions = Versions; foreach (var observer in allowed) { var observerVersion1 = CurrentVersion(observer); var observerVersion2 = other.CurrentVersion(observer); var rows1 = ObserverRows(observer); var rows2 = other.ObserverRows(observer); if (rows1 != null && rows2 != null) { var rows = observerVersion1 > observerVersion2 ? rows1 : rows2; foreach (var record in rows.Values.Where(r => allowed.Contains(r.Subject))) { recordBuilder.Add(record); } } if (rows1 != null && rows2 == null) { if (observerVersion1 > observerVersion2) { foreach (var record in rows1.Values.Where(r => allowed.Contains(r.Subject))) { recordBuilder.Add(record); } } } if (rows1 == null && rows2 != null) { if (observerVersion2 > observerVersion1) { foreach (var record in rows2.Values.Where(r => allowed.Contains(r.Subject))) { recordBuilder.Add(record); } } } if (observerVersion2 > observerVersion1) { newVersions = newVersions.SetItem(observer, observerVersion2); } } newVersions = ImmutableDictionary.CreateRange(newVersions.Where(p => allowed.Contains(p.Key))); return(new Reachability(recordBuilder.ToImmutable(), newVersions)); }
public Reachability Merge(IEnumerable<UniqueAddress> allowed, Reachability other) { var recordBuilder = ImmutableList.CreateBuilder<Record>(); //TODO: Size hint somehow? var newVersions = _versions; foreach (var observer in allowed) { var observerVersion1 = CurrentVersion(observer); var observerVersion2 = other.CurrentVersion(observer); var rows1 = ObserverRows(observer); var rows2 = other.ObserverRows(observer); if (rows1 != null && rows2 != null) { var rows = observerVersion1 > observerVersion2 ? rows1 : rows2; foreach(var record in rows.Values.Where(r => allowed.Contains(r.Subject))) recordBuilder.Add(record); } if (rows1 != null && rows2 == null) { if(observerVersion1 > observerVersion2) foreach (var record in rows1.Values.Where(r => allowed.Contains(r.Subject))) recordBuilder.Add(record); } if (rows1 == null && rows2 != null) { if (observerVersion2 > observerVersion1) foreach (var record in rows2.Values.Where(r => allowed.Contains(r.Subject))) recordBuilder.Add(record); } if (observerVersion2 > observerVersion1) newVersions = newVersions.SetItem(observer, observerVersion2); } newVersions = ImmutableDictionary.CreateRange(newVersions.Where(p => allowed.Contains(p.Key))); return new Reachability(recordBuilder.ToImmutable(), newVersions); }