private static IResolved <T> ResolveConflict <T>(Insert <T> a, IChange <T> b) { switch (b) { case Delete <T> delete: if (delete.OldRange.Contains(a.OldRange, includeStart: false)) { return(Resolved.AsConflict(delete, a, "[B] is deleting text that [A] is inserting into.")); } else { return(Resolved.AsNoMerge(delete, a)); } case Insert <T> insert: if (a.NewRange.Start == insert.NewRange.Start) { if (a.Value.Equals(insert.Value)) { return(Resolved.AsMerge(a, insert, a)); } else { return(Resolved.AsConflict(a, insert, "[A] && [B] are inserting text at the same location.")); } } else { return(Resolved.AsNoMerge(a, insert)); } default: throw new ArgumentException($"Unknown change type: {b.GetType().Name}."); } }
private static IResolved <T> ResolveConflict <T>(IChange <T> a, IChange <T> b) { switch (a) { case Delete <T> delete: return(ResolveConflict(delete, b)); case Insert <T> insert: return(ResolveConflict(insert, b)); default: throw new ArgumentException($"Unknown change type: {a.GetType().Name}."); } }
private static IResolved <T> ResolveConflict <T>(Delete <T> a, IChange <T> b) { switch (b) { case Delete <T> delete: if (a.OldRange.OverlapsWith(delete.OldRange)) { var value = a.Value; var range = Range.Join(a.OldRange, delete.OldRange); var newDelete = new Delete <T> ( value: a.Value, deletedRange: Range.Join(a.OldRange, delete.OldRange), newPosition: a.NewRange.Start ); return(Resolved.AsMerge(a, delete, newDelete)); } else { return(Resolved.AsNoMerge(a, delete)); } case Insert <T> insert: if (a.OldRange.Contains(insert.OldRange, includeStart: false)) { return(Resolved.AsConflict(a, insert, "[A] is deleting text that [B] is inserting into.")); } else { return(Resolved.AsNoMerge(a, insert)); } default: throw new ArgumentException($"Unknown change type: {b.GetType().Name}."); } }
private static void Show(IChange obj) { Console.WriteLine($"{obj.GetType()}: {nameof(obj.Change)}: {obj.Change}"); }