|
|
|
package lexer
|
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewIsInRunes generates a rune condition checker that accepts
|
|
|
|
// the runes specified
|
|
|
|
func NewIsInRunes(s ...rune) func(rune) bool {
|
|
|
|
return NewIsIn(string(s))
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
func IsSpace(r rune) bool {
|
|
|
|
return unicode.IsSpace(r)
|
|
|
|
}
|