Skip to content

Commit 631cc78

Browse files
committed
✨ map_token combinator
1 parent f52736f commit 631cc78

File tree

3 files changed

+58
-6
lines changed

3 files changed

+58
-6
lines changed

src/parz/combinators.gleam

+4
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ pub fn map(parser: Parser(a), transform) {
135135
}
136136
}
137137

138+
pub fn map_token(parser: Parser(a), t) {
139+
map(parser, fn(_) { t })
140+
}
141+
138142
pub fn try_map(parser: Parser(a), transform) {
139143
fn(input) {
140144
case parser(input) {

test/combinators_test.gleam

+50-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import gleeunit/should
22
import parz.{run}
33
import parz/combinators.{
44
as_list, between, choice, concat_str, label_error, left, many, many1, map,
5-
right, separator, separator1, sequence,
5+
map_token, right, separator, separator1, sequence, try_map,
66
}
7-
import parz/parsers.{letters, str}
7+
import parz/parsers.{letters, regex, str}
88
import parz/types.{ParserState}
99

1010
pub fn left_test() {
@@ -189,6 +189,54 @@ pub fn map_test() {
189189
|> should.be_error
190190
}
191191

192+
pub fn try_map_test() {
193+
let error = "No content"
194+
let parser =
195+
between(str("["), regex("^[A-Za-z]*"), str("]"))
196+
|> try_map(fn(ok) {
197+
case ok {
198+
"" -> Error(error)
199+
content -> Ok(Content(content))
200+
}
201+
})
202+
203+
run(parser, "[hello]")
204+
|> should.be_ok
205+
|> should.equal(ParserState(Content("hello"), ""))
206+
207+
run(parser, "[hello]x")
208+
|> should.be_ok
209+
|> should.equal(ParserState(Content("hello"), "x"))
210+
211+
run(parser, "[]x")
212+
|> should.be_error
213+
|> should.equal(error)
214+
215+
run(parser, "[hellox")
216+
|> should.be_error
217+
}
218+
219+
type Token {
220+
Token
221+
}
222+
223+
pub fn map_token_test() {
224+
let parser =
225+
str("hello")
226+
|> map_token(Token)
227+
228+
run(parser, "hello")
229+
|> should.be_ok
230+
|> should.equal(ParserState(Token, ""))
231+
232+
run(parser, "hellox")
233+
|> should.be_ok
234+
|> should.equal(ParserState(Token, "x"))
235+
236+
run(parser, "xhello")
237+
|> should.be_error
238+
}
239+
192240
pub fn as_list_test() {
193241
let parser = as_list(str("x"))
194242

test/simple_parser_test.gleam

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import gleeunit/should
22
import parz.{run}
33
import parz/combinators.{
4-
choice, label_error, left, map, separator1, sequence, try_map,
4+
choice, label_error, left, map, map_token, separator1, sequence, try_map,
55
}
66
import parz/parsers.{letters, regex, str}
77
import parz/types.{ParserState}
@@ -40,9 +40,9 @@ fn parser() {
4040
letters()
4141
|> map(Identifier)
4242

43-
let string_kind = str("string") |> map(fn(_) { StringKind })
44-
let number_kind = str("number") |> map(fn(_) { NumberKind })
45-
let boolean_kind = str("boolean") |> map(fn(_) { BooleanKind })
43+
let string_kind = str("string") |> map_token(StringKind)
44+
let number_kind = str("number") |> map_token(NumberKind)
45+
let boolean_kind = str("boolean") |> map_token(BooleanKind)
4646

4747
let kind = choice([string_kind, number_kind, boolean_kind])
4848
let node =

0 commit comments

Comments
 (0)