public static bool DeepEquals([NotNull] ITuple x, [NotNull] ITuple y, [NotNull] IEqualityComparer comparer)
        {
            Contract.Requires(x != null && y != null && comparer != null);

            using (var xs = x.GetEnumerator())
                using (var ys = y.GetEnumerator())
                {
                    while (xs.MoveNext())
                    {
                        if (!ys.MoveNext())
                        {
                            return(false);
                        }
                        if (!comparer.Equals(xs.Current, ys.Current))
                        {
                            return(false);
                        }
                    }

                    return(!ys.MoveNext());
                }
        }
        public static int StructuralCompare(ITuple x, ITuple y, [NotNull] IComparer comparer)
        {
            Contract.Requires(comparer != null);

            if (object.ReferenceEquals(x, y))
            {
                return(0);
            }
            if (object.ReferenceEquals(x, null))
            {
                return(-1);
            }
            if (object.ReferenceEquals(y, null))
            {
                return(1);
            }

            using (var xs = x.GetEnumerator())
                using (var ys = y.GetEnumerator())
                {
                    while (xs.MoveNext())
                    {
                        if (!ys.MoveNext())
                        {
                            return(1);
                        }

                        int cmp = comparer.Compare(xs.Current, ys.Current);
                        if (cmp != 0)
                        {
                            return(cmp);
                        }
                    }
                    return(ys.MoveNext() ? -1 : 0);
                }
        }
 public IEnumerator <object> GetEnumerator()
 {
     return(m_items.GetEnumerator());
 }