Make nom::combinator::iterator
's trait bounds match impl Iterator for &mut ParserIterator
's
#1584
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
A
ParserIterator
's primary function is to be an iterator. I'd go so far as to say that aParserIterator
that can't function as an iterator is broken.Currently,
nom::combinator::iterator
expects aParser<Input, Output, Error>
for itsf
parameter, but the returnedParserIterator
object is not actually usable as an iterator unlessf
also conforms toFnMut(Input) -> IResult<Input, Output, Error>
, because of the constraints onimpl Iterator for &mut ParserIterator
.In particular, passing in a (type-erased)
impl Parser<Input, Output, Error>
results in an unusable iterator, even if its underlying (unerased) type actually conforms toFnMut(Input) -> IResult<Input, Output, Error>
.So, to avoid confusion for callers, let's constrain the
f
parameter to what's actually expected by theimpl Iterator
.Alternatives
Of course, ideally, the constraints on
impl Iterator for &mut ParserIterator
would be loosened to accept aParser<Input, Output, Error>
instead. However, I don't know of any current way to do that without breaking compatibility:Parser
an associatedOutput
type. But you can't do that without affecting all callers.Output
type parameter toParserIterator
. But then callers have to be adjusted to specifyParserIterator
with 4 type parameters instead of 3, so that also breaks compatibility.