using System.Collections; using System.Collections.Immutable; namespace Masuit.Tools.TextDiff; public class SemanticsImmutableList(ImmutableList list) : IImmutableList, IEquatable> { #region IImutableList implementation public T this[int index] => list[index]; public int Count => list.Count; public IImmutableList Add(T value) => list.Add(value).WithValueSemantics(); public IImmutableList AddRange(IEnumerable items) => list.AddRange(items).WithValueSemantics(); public IImmutableList Clear() => list.Clear().WithValueSemantics(); public IEnumerator GetEnumerator() => list.GetEnumerator(); public int IndexOf(T item, int index, int count, IEqualityComparer? equalityComparer) => list.IndexOf(item, index, count, equalityComparer); IImmutableList IImmutableList.Insert(int index, T element) => list.Insert(index, element).WithValueSemantics(); public SemanticsImmutableList Insert(int index, T element) => list.Insert(index, element).WithValueSemantics(); public IImmutableList InsertRange(int index, IEnumerable items) => list.InsertRange(index, items).WithValueSemantics(); public int LastIndexOf(T item, int index, int count, IEqualityComparer? equalityComparer) => list.LastIndexOf(item, index, count, equalityComparer); public IImmutableList Remove(T value, IEqualityComparer? equalityComparer) => list.Remove(value, equalityComparer).WithValueSemantics(); public IImmutableList RemoveAll(Predicate match) => list.RemoveAll(match).WithValueSemantics(); IImmutableList IImmutableList.RemoveAt(int index) => list.RemoveAt(index).WithValueSemantics(); public SemanticsImmutableList RemoveAt(int index) => list.RemoveAt(index).WithValueSemantics(); public IImmutableList RemoveRange(IEnumerable items, IEqualityComparer? equalityComparer) => list.RemoveRange(items, equalityComparer).WithValueSemantics(); public IImmutableList RemoveRange(int index, int count) => list.RemoveRange(index, count).WithValueSemantics(); public IImmutableList Replace(T oldValue, T newValue, IEqualityComparer? equalityComparer) => list.Replace(oldValue, newValue, equalityComparer).WithValueSemantics(); public IImmutableList SetItem(int index, T value) => list.SetItem(index, value); IEnumerator IEnumerable.GetEnumerator() => list.GetEnumerator(); #endregion IImutableList implementation public ImmutableList.Builder ToBuilder() => list.ToBuilder(); public bool IsEmpty => list.IsEmpty; public override bool Equals(object obj) => Equals(obj as IImmutableList); public bool Equals(IImmutableList? other) => this.SequenceEqual(other ?? ImmutableList.Empty); public override int GetHashCode() { unchecked { return this.Aggregate(19, (h, i) => h * 19 + i?.GetHashCode() ?? 0); } } public static implicit operator SemanticsImmutableList(ImmutableList list) => list.WithValueSemantics(); public static bool operator ==(SemanticsImmutableList left, SemanticsImmutableList right) => left.Equals(right); public static bool operator !=(SemanticsImmutableList left, SemanticsImmutableList right) => !left.Equals(right); } internal static class Ex { public static SemanticsImmutableList WithValueSemantics(this ImmutableList list) => new(list); }