// ---------------------------------------------------------------------------- // Tuple structs for use in .NET Not-Quite-3.5 (e.g. Unity3D). // // Used Chapter 3 in http://functional-programming.net/ as a starting point. // // Note: .NET 4.0 Tuples are immutable classes so they're *slightly* different. // ---------------------------------------------------------------------------- using System; /// /// Represents a functional tuple that can be used to store /// two values of different types inside one object. /// /// The type of the first element /// The type of the second element public sealed class Tuple { private readonly T1 item1; private readonly T2 item2; /// /// Retyurns the first element of the tuple /// public T1 Item1{ get{ return item1; } } /// /// Returns the second element of the tuple /// public T2 Item2{ get{ return item2; } } /// /// Create a new tuple value /// /// First element of the tuple /// Second element of the tuple public Tuple(T1 item1, T2 item2){ this.item1 = item1; this.item2 = item2; } public override string ToString(){ return string.Format("Tuple({0}, {1})", Item1, Item2); } public override int GetHashCode(){ int hash = 17; hash = hash * 23 + (item1 == null ? 0 : item1.GetHashCode()); hash = hash * 23 + (item2 == null ? 0 : item2.GetHashCode()); return hash; } public override bool Equals(object o){ if(!(o is Tuple)){ return false; } var other = (Tuple)o; return this == other; } public bool Equals(Tuple other){ return this == other; } public static bool operator==(Tuple a, Tuple b){ if(object.ReferenceEquals(a, null)){ return object.ReferenceEquals(b, null); }else{ if(object.ReferenceEquals(b, null)) return false; } if(a.item1 == null && b.item1 != null) return false; if(a.item2 == null && b.item2 != null) return false; return a.item1.Equals(b.item1) && a.item2.Equals(b.item2); } public static bool operator!=(Tuple a, Tuple b){ return !(a == b); } public void Unpack(Action unpackerDelegate){ unpackerDelegate(Item1, Item2); } }