/// <summary> /// WARNING: Per CvRDT definition, this operation must be COMMUTATIVE, ASSOCIATIVE, and IDEMPOTENT. /// Failure to comply with these requirements may result in an infinite inter-node rotary traffic pattern. /// </summary> /// <param name="others"></param> /// <returns>Object instance which results from merge, it can be one of the existing instances or a new one</returns> public (bool isnew, HeapObject obj) MergeCrdt(IEnumerable <HeapObject> others) { if (others == null) { return(false, this); } if (!others.Any()) { return(false, this); } others.IsTrue(v => v.All(one => one.GetType() == this.GetType() && one.Sys_Id == this.Sys_Id), "Non empty version for the same Sys_Id"); var versions = others.AddOneAtStart(this); var result = this; foreach (var ver in versions) { if (ver.Sys_VerState == State.Deleted) { if (result.Sys_VerState != State.Deleted) { result = ver; continue; } } if (ver.Sys_VerUtc > result.Sys_VerUtc) { result = ver; } } return(false, result); }
public void AddOneAtStartTest_2() { IEnumerable <int> orig = null; var seq = orig.AddOneAtStart(102).ToArray(); Aver.AreEqual(1, seq.Length); Aver.AreEqual(102, seq[0]); }