// 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 := gigaparsec.Map(whitespace, 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.Map(gigaparsec.Satisfy(isWhitespaceASCII), func(byte) struct{} { return struct{}{} }) }