bitwalker / bitwalker/combine

Missing sequential operations?

Open
#45 0 comments 2 reactions 0 assignees View on GitHub
Dominant language
Elixir
Stars
200
Forks
20
PR merge metrics
No merged PRs in 30d

Description

Might have missed this, but the library seems to be missing a feature for chaining sequential operations?
Something along the lines of an `and_then` function/parser?

The parser would take as input the parser to chain a sequential computation with; and a function that would take the results of previously said parser, and returns another parser for further parsing.

This could be for example useful when later parsed input depends on earlier parsed input.
e.g. XML: checking if closing tag is same as opening tag.

Some pseudo-code (out of a lib I'm working on atm) that hopefully showcases the use-case where this could be used, closing_tag is a helper function that returns a parser based on a string input argument (the opening tag):
```elixir
def tag_with_content_parser() do
tag_with_attributes = sequence([tag(), many(attribute())])
between(char("<"), tag_with_attrs, char(">"))
|> and_then(fn [tag, attributes] ->
sequence([value_parser(), ignore(closing_tag(tag))])
|> map(fn [inner_contents] ->
%XML.Tag{name: tag, attributes: attributes, value: inner_contents}
end)
end)
end
```

Side note: in Haskell this kind of function is heavily used when utilizing the monad interface of the parser type, a.k.a. the `>>=`/bind/flat_map operator.

For now, I will do it with a work-around, but this would be a very powerful feature to have since it allows specifying dependencies between multiple parsing steps.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.