public ReadOnlyMemory <char> ReadFrom
        (
            char[] openChars,
            char[] closeChars
        )
        {
            if (IsEOF)
            {
                return(EmptySpan);
            }

            var state = new StateHolder(this);
            var c     = PeekChar();

            if (Array.IndexOf(openChars, c) < 0)
            {
                state.Dispose();
                return(EmptySpan);
            }
            ReadChar();

            while (true)
            {
                c = ReadChar();
                if (c == EOF)
                {
                    state.Dispose();
                    return(EmptySpan);
                }
                if (Array.IndexOf(closeChars, c) >= 0)
                {
                    break;
                }
            }

            return(Substring
                   (
                       state.Position,
                       _position - state.Position
                   ));
        }
        public ReadOnlyMemory <char> ReadUntil
        (
            char[] openChars,
            char[] closeChars,
            char[] stopChars
        )
        {
            var state = new StateHolder(this);
            var level = 0;

            while (true)
            {
                var c = PeekChar();
                if (c == EOF)
                {
                    state.Dispose();
                    return(EmptySpan);
                }

                if (c.IsOneOf(openChars))
                {
                    level++;
                }
                else if (c.IsOneOf(closeChars))
                {
                    if (level == 0 &&
                        c.IsOneOf(stopChars))
                    {
                        break;
                    }
                    level--;
                }
                else if (c.IsOneOf(stopChars))
                {
                    if (level == 0)
                    {
                        break;
                    }
                }
                ReadChar();
            }

            return(Substring
                   (
                       state.Position,
                       _position - state.Position
                   ));
        }
        public ReadOnlyMemory <char> ReadUntil
        (
            string stopString
        )
        {
            // Sure.NotNullNorEmpty(stopString, nameof(stopString));

            var state  = new StateHolder(this);
            var length = 0;
            var span   = _text.Span;

            while (true)
            {
AGAIN:
                var c = ReadChar();
                if (c == EOF)
                {
                    state.Dispose();
                    return(EmptySpan);
                }

                length++;
                if (length >= stopString.Length)
                {
                    var start = _position - stopString.Length;
                    for (var i = 0; i < stopString.Length; i++)
                    {
                        if (span[start + i] != stopString[i])
                        {
                            goto AGAIN;
                        }
                    }
                    break;
                }
            }

            var result = Substring
                         (
                state.Position,
                _position - state.Position - stopString.Length
                         );

            _position -= stopString.Length;
            return(result);
        }