From eb9261b47807cd464aced3d93fbdba6dcd1b6f0a Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Tue, 29 Aug 2023 23:06:38 +0000 Subject: [PATCH] lexer: NewIsNot(), NewIsIn(), NewIsOneOf() Signed-off-by: Alejandro Mery --- lexer/runes.go | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lexer/runes.go b/lexer/runes.go index 9b13b5a..a69992d 100644 --- a/lexer/runes.go +++ b/lexer/runes.go @@ -1,6 +1,38 @@ package lexer -import "unicode" +import ( + "strings" + "unicode" +) + +// NewIsNot generates a rune condition checker that reverses the +// decision of the given checker. +func NewIsNot(cond func(rune) bool) func(rune) bool { + return func(r rune) bool { + return !cond(r) + } +} + +// NewIsIn generates a rune condition checker that accepts runes +// contained on the provided string +func NewIsIn(s string) func(rune) bool { + return func(r rune) bool { + return strings.ContainsRune(s, r) + } +} + +// NewIsOneOf generates a run condition checker that accepts runes +// accepted by any of the given checkers +func NewIsOneOf(s ...func(rune) bool) func(rune) bool { + return func(r rune) bool { + for _, cond := range s { + if cond(r) { + return true + } + } + return false + } +} // IsSpace reports whether the rune is a space character as // defined by Unicode's White Space property