public Gossip Merge(Gossip that)
{
//TODO: Member ordering import?
// 1. merge vector clocks
var mergedVClock = _version.Merge(that._version);
// 2. merge members by selecting the single Member with highest MemberStatus out of the Member groups
var mergedMembers = EmptyMembers.Union(Member.PickHighestPriority(this._members, that._members));
// 3. merge reachability table by picking records with highest version
var mergedReachability = this._overview.Reachability.Merge(mergedMembers.Select(m => m.UniqueAddress),
that._overview.Reachability);
// 4. Nobody can have seen this new gossip yet
var mergedSeen = ImmutableHashSet.Create<UniqueAddress>();
return new Gossip(mergedMembers, new GossipOverview(mergedSeen, mergedReachability), mergedVClock);
}