|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"slices"
|
|
|
|
"unicode"
|
|
|
|
)
|
|
|
|
|
|
|
|
func dotCharacters() []rune { // Returns all possible characters represented by the dot metacharacter
|
|
|
|
start := 0x0020
|
|
|
|
end := 0x007E
|
|
|
|
to_return := make([]rune, (end-start)+1)
|
|
|
|
for i := start; i <= end; i++ {
|
|
|
|
to_return = append(to_return, rune(i))
|
|
|
|
}
|
|
|
|
return to_return
|
|
|
|
}
|
|
|
|
|
|
|
|
func isAlphaNum(c rune) bool {
|
|
|
|
return unicode.IsLetter(c) || unicode.IsNumber(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
func assert(cond bool) {
|
|
|
|
if cond != true {
|
|
|
|
panic("Assertion Failed")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure that the given elements are only appended to the given slice if they
|
|
|
|
// don't already exist. Returns the new slice, and the number of unique items appended.
|
|
|
|
func unique_append[T comparable](slc []T, items ...T) ([]T, int) {
|
|
|
|
num_appended := 0
|
|
|
|
for _, item := range items {
|
|
|
|
if !slices.Contains(slc, item) {
|
|
|
|
slc = append(slc, item)
|
|
|
|
num_appended++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return slc, num_appended
|
|
|
|
}
|
|
|
|
|
|
|
|
// Returns true only if all the given elements are equal
|
|
|
|
func allEqual[T comparable](items ...T) bool {
|
|
|
|
first := items[0]
|
|
|
|
for _, item := range items {
|
|
|
|
if item != first {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|