private IDiffItem ProcessConflict(IDiffOrderedCollectionItem left, IDiffOrderedCollectionItem right, IConflictContainer conflicts) { if (left is IDiffItemChanged && right is IDiffItemChanged) { IDiff <TItemType> diff = this.aMergeItemsDiffs.MergeDiffs( ((IDiffItemChanged <TItemType>)left).ValueDiff, ((IDiffItemChanged <TItemType>)right).ValueDiff, conflicts ); return(new DiffOrderedCollectionChanged <TItemType>(left.ItemIndex, diff)); } else if (left.IsSame(right)) { return(left); } DiffAnyConflicted conflict = new DiffAnyConflicted(left, right); conflicts.RegisterConflict(conflict); return(conflict); }
private void SepareAdditions(List <IDiffOrderedCollectionItem> input, out List <IDiffOrderedCollectionItem> added, out IDiffOrderedCollectionItem other) { if (input.Last() is IDiffItemAdded) { other = null; added = input; } else if (input.Count == 1) { other = input.Last(); added = null; } else { other = input.Last(); input.RemoveAt(input.Count - 1); added = input; } if (added != null && !added.All(x => x is IDiffItemAdded)) { throw new Exception("Error in input diff"); } }