namespace ScreenConnect; public static class Tuple { public static Tuple Create(T item1, U item2) { return new Tuple { Item1 = item1, Item2 = item2 }; } public static Tuple Create(T item1, U item2, V item3) { return new Tuple { Item1 = item1, Item2 = item2, Item3 = item3 }; } public static Tuple Create(T item1, U item2, V item3, W item4) { return new Tuple { Item1 = item1, Item2 = item2, Item3 = item3, Item4 = item4 }; } } public struct Tuple { public T Item1 { get; internal set; } public U Item2 { get; internal set; } public Tuple With(V withItem) { return Tuple.Create(Item1, Item2, withItem); } public Tuple With(V withItem1, W withItem2) { return Tuple.Create(Item1, Item2, withItem1, withItem2); } public Tuple With(Tuple withItem) { return Tuple.Create(Item1, Item2, withItem.Item1, withItem.Item2); } public Tuple Swap2(NewU newItem) { return Tuple.Create(Item1, newItem); } public static bool operator ==(Tuple left, Tuple right) { return left.Equals(right); } public static bool operator !=(Tuple left, Tuple right) { return !left.Equals(right); } public override int GetHashCode() { return HashCode.Seed.And(Item1).And(Item2); } public override bool Equals(object obj) { if (!(obj is Tuple tuple)) { return false; } if (object.Equals(Item1, tuple.Item1)) { return object.Equals(Item2, tuple.Item2); } return false; } public override string ToString() { return $"Tuple[{Item1}, {Item2}]"; } } public struct Tuple { public T Item1 { get; internal set; } public U Item2 { get; internal set; } public V Item3 { get; internal set; } public Tuple With(W withItem) { return Tuple.Create(Item1, Item2, Item3, withItem); } public static bool operator ==(Tuple left, Tuple right) { return left.Equals(right); } public static bool operator !=(Tuple left, Tuple right) { return !left.Equals(right); } public override int GetHashCode() { return HashCode.Seed.And(Item1).And(Item2).And(Item3); } public override bool Equals(object obj) { if (!(obj is Tuple tuple)) { return false; } if (object.Equals(Item1, tuple.Item1) && object.Equals(Item2, tuple.Item2)) { return object.Equals(Item3, tuple.Item3); } return false; } public override string ToString() { return $"Tuple[{Item1}, {Item2}, {Item3}]"; } } public struct Tuple { public T Item1 { get; internal set; } public U Item2 { get; internal set; } public V Item3 { get; internal set; } public W Item4 { get; internal set; } public static bool operator ==(Tuple left, Tuple right) { return left.Equals(right); } public static bool operator !=(Tuple left, Tuple right) { return !left.Equals(right); } public override int GetHashCode() { return HashCode.Seed.And(Item1).And(Item2).And(Item3) .And(Item4); } public override bool Equals(object obj) { if (!(obj is Tuple tuple)) { return false; } if (object.Equals(Item1, tuple.Item1) && object.Equals(Item2, tuple.Item2) && object.Equals(Item3, tuple.Item3)) { return object.Equals(Item4, tuple.Item4); } return false; } public override string ToString() { return string.Format("Tuple[{0}, {1}, {2}, {3}]", new object[4] { Item1, Item2, Item3, Item4 }); } }