30 lines
1.2 KiB
Go
30 lines
1.2 KiB
Go
// SPDX-License-Identifier: Unlicense
|
|
|
|
package bytes
|
|
|
|
import (
|
|
"git.codemonkeysoftware.net/b/gigaparsec"
|
|
)
|
|
|
|
// Token wraps a parser to discard all whitespace after the parsed input.
|
|
// whitespace is a parser that will consume non-empty whitespace.
|
|
func Token[Out any](whitespace gigaparsec.Parser[byte, struct{}]) func(p gigaparsec.Parser[byte, Out]) gigaparsec.Parser[byte, Out] {
|
|
mappedWS := whitespace.Map(func(struct{}) struct{} { return struct{}{} })
|
|
var ignoreWS gigaparsec.Parser[byte, struct{}] = func(s gigaparsec.State[byte]) (gigaparsec.Result[byte, struct{}], error) {
|
|
result, err := mappedWS(s)
|
|
return result.Consume(false), err
|
|
}
|
|
return func(p gigaparsec.Parser[byte, Out]) gigaparsec.Parser[byte, Out] {
|
|
return gigaparsec.Seq(p, gigaparsec.Repeat(0, ignoreWS), func(val Out, _ []struct{}) Out { return val })
|
|
}
|
|
}
|
|
|
|
func isWhitespaceASCII(b byte) bool {
|
|
return b == ' ' || (b >= '\t' && b <= '\r')
|
|
}
|
|
|
|
// WhitespaceASCII consumes one ASCII whitespace character: space, tab, LF, CR, vertical tab, or form feed.
|
|
func WhitespaceASCII() gigaparsec.Parser[byte, struct{}] {
|
|
return gigaparsec.Satisfy(isWhitespaceASCII).Map(func(byte) struct{} { return struct{}{} })
|
|
}
|