diff options
Diffstat (limited to 'internal/rosa/azalea/evaluate.go')
| -rw-r--r-- | internal/rosa/azalea/evaluate.go | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/internal/rosa/azalea/evaluate.go b/internal/rosa/azalea/evaluate.go index 3658ad6d..32c4f066 100644 --- a/internal/rosa/azalea/evaluate.go +++ b/internal/rosa/azalea/evaluate.go @@ -11,7 +11,7 @@ import ( // Value are types supported by the language. type Value interface { - bool | int64 | string | []string | [][2]string + bool | int64 | string | []string | []int64 | [][2]string } type ( @@ -85,6 +85,18 @@ func evaluate[T Value](d PF, s []Frame, expr any, rp *T) bool { return evaluateAny(d, s, expr, rp) } +// evaluateArray evaluates expr and returns its values as a slice. +func evaluateArray[T Value](d PF, s []Frame, expr Array) []T { + r := make([]T, 0, len(expr)) + for i := range expr { + var _r T + if evaluate(d, s, expr[i], &_r) { + r = append(r, _r) + } + } + return r +} + // TypeError is an unexpected type during evaluation. type TypeError struct { Concrete, Asserted reflect.Type @@ -232,14 +244,13 @@ func evaluateAny(d PF, s []Frame, expr, rp any) bool { return true case Array: - r := make([]string, 0, len(e)) - for i := range e { - var _r string - if evaluate(d, s, e[i], &_r) { - r = append(r, _r) + if len(e) > 0 && len(e[0]) == 1 { + if _, ok := e[0][0].(Int); ok { + store(rp, evaluateArray[int64](d, s, e)) + return true } } - store(rp, r) + store(rp, evaluateArray[string](d, s, e)) return true case []KV: |
