public static int Sum <TEnumerator>(this IStrongEnumerable <int, TEnumerator> source)
            where TEnumerator : struct, IStrongEnumerator <int>
        {
            int sum = 0;

            foreach (var number in source)
            {
                sum += number;
            }

            return(sum);
        }
        public static bool Any <T, TEnumerator>(this IStrongEnumerable <T, TEnumerator> source, Predicate <T> predicate)
            where TEnumerator : struct, IStrongEnumerator <T>
        {
            var enumerator = source.GetEnumerator();

            while (enumerator.MoveNext())
            {
                if (predicate.Invoke(enumerator.Current))
                {
                    return(true);
                }
            }

            return(false);
        }
        /// <summary>
        /// possible further optimizations: move from the end to the start
        /// </summary>
        public static T Last <T, TEnumerator>(this IStrongEnumerable <T, TEnumerator> source)
            where TEnumerator : struct, IStrongEnumerator <T>
        {
            var enumerator = source.GetEnumerator();

            if (!enumerator.MoveNext())
            {
                throw new InvalidOperationException();
            }

            while (enumerator.MoveNext())
            {
            }

            return(enumerator.Current);
        }