public Maybe <T> LookAhead(int index)
        {
            if (_Disposed)
            {
                throw new ObjectDisposedException("IEnumerator<T>");
            }

            if (LookAheadList.Count >= (index + 1))
            {
                return(LookAheadList[index].ToMaybe());
            }

            int itemsToEnumerate = (index + 1) - LookAheadList.Count;

            for (int itemsEnumerated = 0; itemsEnumerated < itemsToEnumerate; itemsEnumerated++)
            {
                bool results = _InnerEnumerator.MoveNext();
                if (results)
                {
                    LookAheadList.Add(_InnerEnumerator.Current);
                }
                else
                {
                    return(Maybe <T> .NoValue);
                }
            }

            return(LookAheadList[index].ToMaybe());
        }
        public bool MoveNext()
        {
            if (_Disposed)
            {
                throw new ObjectDisposedException("IEnumerator<T>");
            }

            if (LookAheadList.Count <= 0)
            {
                bool results = _InnerEnumerator.MoveNext();

                _Current = _InnerEnumerator.Current;
                return(results);
            }

            _Current = LookAheadList[0];
            LookAheadList.RemoveAt(0);

            return(true);
        }