You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Hi! may you consider adding manyEndingWith (name subject to change)? The code would be like:
-- copy paste from manyTill_. It takes a parser p and a finalizer end. It returns the list of -- all parsed elements with p and(!) the element parsed with endmanyEndingWith::MonadPlusm=>ma->ma->m [a]
manyEndingWith p end = go idwhere
go f =do
done <- optional end
case done ofJust done' ->return$ f [done']
Nothing->do
x <- p
go (f . (x :))
This is particulary usefull when parsing the eof. For example in megaparsec this code will hang forever
-- This hangs forever. But I don't know why.
my_parser = (True<$ symbol ";") <|> (True<$ symbol "|") <|> (False<$ eof)
parse (many my_parser) """;|"> hangs forever...
Ideally the last example could return Right [True, True, False], but I think it isn't possible with the current combinators. With the new combinator the above example could be rewritten as
my_parser = (True<$ symbol ";") <|> (True<$ symbol "|")
parse (manyEnding my_parser (False<$ eof)) """;|">Right [True, True, False]
I know manyTill_ exists but, It returns m ([a], end), forcing you to append end at the end of the list (if a ~ end), which is inefficient for linked lists.
The text was updated successfully, but these errors were encountered:
This case seems to be quite particular. I agree that adding an element to the end of the linked list in inefficient, but then there could be many ways to avoid building a list at all (e.g. by counting the number of symbols matched before eof instead of building a list), or to avoid eof being represented by an element in the list. All this seems to belong to the area of creativity that concerns the code of a particular parser, not a library of common combinators.
Hi! may you consider adding
manyEndingWith
(name subject to change)? The code would be like:This is particulary usefull when parsing the
eof
. For example inmegaparsec
this code will hang foreverIdeally the last example could return
Right [True, True, False]
, but I think it isn't possible with the current combinators. With the new combinator the above example could be rewritten asI know
manyTill_
exists but, It returnsm ([a], end)
, forcing you to appendend
at the end of the list (ifa ~ end
), which is inefficient for linked lists.The text was updated successfully, but these errors were encountered: