SemanticsImmutableList.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System.Collections;
  2. using System.Collections.Immutable;
  3. namespace Masuit.Tools.TextDiff;
  4. public class SemanticsImmutableList<T>(ImmutableList<T> list) : IImmutableList<T>, IEquatable<IImmutableList<T>>
  5. {
  6. #region IImutableList implementation
  7. public T this[int index] => list[index];
  8. public int Count => list.Count;
  9. public IImmutableList<T> Add(T value) => list.Add(value).WithValueSemantics();
  10. public IImmutableList<T> AddRange(IEnumerable<T> items) => list.AddRange(items).WithValueSemantics();
  11. public IImmutableList<T> Clear() => list.Clear().WithValueSemantics();
  12. public IEnumerator<T> GetEnumerator() => list.GetEnumerator();
  13. public int IndexOf(T item, int index, int count, IEqualityComparer<T>? equalityComparer) => list.IndexOf(item, index, count, equalityComparer);
  14. IImmutableList<T> IImmutableList<T>.Insert(int index, T element) => list.Insert(index, element).WithValueSemantics();
  15. public SemanticsImmutableList<T> Insert(int index, T element) => list.Insert(index, element).WithValueSemantics();
  16. public IImmutableList<T> InsertRange(int index, IEnumerable<T> items) => list.InsertRange(index, items).WithValueSemantics();
  17. public int LastIndexOf(T item, int index, int count, IEqualityComparer<T>? equalityComparer) => list.LastIndexOf(item, index, count, equalityComparer);
  18. public IImmutableList<T> Remove(T value, IEqualityComparer<T>? equalityComparer) => list.Remove(value, equalityComparer).WithValueSemantics();
  19. public IImmutableList<T> RemoveAll(Predicate<T> match) => list.RemoveAll(match).WithValueSemantics();
  20. IImmutableList<T> IImmutableList<T>.RemoveAt(int index) => list.RemoveAt(index).WithValueSemantics();
  21. public SemanticsImmutableList<T> RemoveAt(int index) => list.RemoveAt(index).WithValueSemantics();
  22. public IImmutableList<T> RemoveRange(IEnumerable<T> items, IEqualityComparer<T>? equalityComparer) => list.RemoveRange(items, equalityComparer).WithValueSemantics();
  23. public IImmutableList<T> RemoveRange(int index, int count) => list.RemoveRange(index, count).WithValueSemantics();
  24. public IImmutableList<T> Replace(T oldValue, T newValue, IEqualityComparer<T>? equalityComparer) => list.Replace(oldValue, newValue, equalityComparer).WithValueSemantics();
  25. public IImmutableList<T> SetItem(int index, T value) => list.SetItem(index, value);
  26. IEnumerator IEnumerable.GetEnumerator() => list.GetEnumerator();
  27. #endregion IImutableList implementation
  28. public ImmutableList<T>.Builder ToBuilder() => list.ToBuilder();
  29. public bool IsEmpty => list.IsEmpty;
  30. public override bool Equals(object obj) => Equals(obj as IImmutableList<T>);
  31. public bool Equals(IImmutableList<T>? other) => this.SequenceEqual(other ?? ImmutableList<T>.Empty);
  32. public override int GetHashCode()
  33. {
  34. unchecked
  35. {
  36. return this.Aggregate(19, (h, i) => h * 19 + i?.GetHashCode() ?? 0);
  37. }
  38. }
  39. public static implicit operator SemanticsImmutableList<T>(ImmutableList<T> list) => list.WithValueSemantics();
  40. public static bool operator ==(SemanticsImmutableList<T> left, SemanticsImmutableList<T> right) => left.Equals(right);
  41. public static bool operator !=(SemanticsImmutableList<T> left, SemanticsImmutableList<T> right) => !left.Equals(right);
  42. }
  43. internal static class Ex
  44. {
  45. public static SemanticsImmutableList<T> WithValueSemantics<T>(this ImmutableList<T> list) => new(list);
  46. }