/// <summary> /// Merge clocks /// </summary> public VectorClock Merge(VectorClock clock) { int i = 0; int j = 0; var versions = Versions.ToArray(); var clockVersions = clock.Versions.ToArray(); var newClockVersions = List.empty <ClockEntry>(); while (i < versions.Length && j < clockVersions.Length) { var v1 = versions[i]; var v2 = clockVersions[j]; if (v1.NodeId == v2.NodeId) { var nc = new ClockEntry(v1.NodeId, (int)Math.Max(v1.Version, v2.Version)); newClockVersions = newClockVersions.Add(nc); i++; j++; } else if (v1.NodeId < v2.NodeId) { newClockVersions = newClockVersions.Add(v1); i++; } else { newClockVersions = newClockVersions.Add(v2); j++; } } // Okay now there may be leftovers on one or the other list remaining for (int k = i; k < versions.Length; k++) { newClockVersions = newClockVersions.Add(versions[k]); } for (int k = j; k < clockVersions.Length; k++) { newClockVersions = newClockVersions.Add(clockVersions[k]); } return(new VectorClock(newClockVersions)); }