private void PublishDiff(Gossip oldGossip, Gossip newGossip, Action<object> pub)
{
foreach (var @event in ClusterEvent.DiffMemberEvents(oldGossip, newGossip)) pub(@event);
foreach (var @event in ClusterEvent.DiffUnreachable(oldGossip, newGossip)) pub(@event);
foreach (var @event in ClusterEvent.DiffReachable(oldGossip, newGossip)) pub(@event);
foreach (var @event in ClusterEvent.DiffLeader(oldGossip, newGossip, _selfUniqueAddress)) pub(@event);
foreach (var @event in ClusterEvent.DiffRolesLeader(oldGossip, newGossip, _selfUniqueAddress)) pub(@event);
// publish internal SeenState for testing purposes
foreach (var @event in ClusterEvent.DiffSeen(oldGossip, newGossip, _selfUniqueAddress)) pub(@event);
foreach (var @event in ClusterEvent.DiffReachability(oldGossip, newGossip)) pub(@event);
}