Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proposal: encoding/xml: add iterators Decoder.Tokens, Decoder.RawTokens #68259

Open
dolmen opened this issue Jul 1, 2024 · 2 comments
Open
Labels
Milestone

Comments

@dolmen
Copy link
Contributor

dolmen commented Jul 1, 2024

Proposal Details

Add iter.Seq2 iterator methods on encoding/xml.Decoder to iter over tokens and raw tokens.

func (d *Decoder) Tokens() iter.Seq2[Token, error] {
	return func(yield func(Token, error) bool) {
		for {
			token, err := d.Token()
			if err == io.EOF {
				break
			}
			if !yield(token, err) {
				break
			}
			// What should we do here if err != nil?
		}
	}
}

func (d *Decoder) RawTokens() iter.Seq2[Token, error] {
	return func(yield func(Token, error) bool) {
		for {
			token, err := d.RawToken()
			if err == io.EOF {
				break
			}
			if !yield(token, err) {
				break
			}
			// What should we do here if err != nil?
		}
	}
}

Note: I'm not yet sure to like an iterator that handles a stream error this way.

Related:

@dolmen dolmen added the Proposal label Jul 1, 2024
@gopherbot gopherbot added this to the Proposal milestone Jul 1, 2024
@gabyhelp
Copy link

gabyhelp commented Jul 1, 2024

Related Issues

(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)

@dolmen
Copy link
Contributor Author

dolmen commented Jul 1, 2024

Note that generic functions can also be written outside the package so the Decoder methods would be purely to allow "native" range-over-func support:

func IterTokens[Token any, Tokenizer interface{ Token() (Token, error) }](tok Tokenizer) iter.Seq2[Token, error] {
	return func(yield func(Token, error) bool) {
		for {
			token, err := tok.Token()
			if err == io.EOF {
				break
			}
			if !yield(token, err) {
				break
			}
		}
	}
}

func IterRawTokens[Token any, Tokenizer interface{ RawToken() (Token, error) }](tok Tokenizer) iter.Seq2[Token, error] {
	return func(yield func(Token, error) bool) {
		for {
			token, err := tok.RawToken()
			if err == io.EOF {
				break
			}
			if !yield(token, err) {
				break
			}
		}
	}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: Incoming
Development

No branches or pull requests

3 participants