Skip to content

Commit 572c054

Browse files
authored
feat: implement std.avg (#700)
* feat: implement std.avg
1 parent aece6e9 commit 572c054

File tree

5 files changed

+32
-5
lines changed

5 files changed

+32
-5
lines changed

builtins.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,6 +2066,30 @@ func builtinSum(i *interpreter, arrv value) (value, error) {
20662066
return makeValueNumber(sum), nil
20672067
}
20682068

2069+
func builtinAvg(i *interpreter, arrv value) (value, error) {
2070+
arr, err := i.getArray(arrv)
2071+
if err != nil {
2072+
return nil, err
2073+
}
2074+
2075+
len := float64(arr.length())
2076+
if len == 0 {
2077+
return nil, i.Error("Cannot calculate average of an empty array.")
2078+
}
2079+
2080+
sumValue, err := builtinSum(i, arrv)
2081+
if err != nil {
2082+
return nil, err
2083+
}
2084+
sum, err := i.getNumber(sumValue)
2085+
if err != nil {
2086+
return nil, err
2087+
}
2088+
2089+
avg := sum.value/len
2090+
return makeValueNumber(avg), nil
2091+
}
2092+
20692093
func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
20702094
arr, err := i.getArray(arrv)
20712095
if err != nil {
@@ -2478,6 +2502,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
24782502
&generalBuiltin{name: "maxArray", function: builtinMaxArray, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
24792503
&unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}},
24802504
&unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}},
2505+
&unaryBuiltin{name: "avg", function: builtinAvg, params: ast.Identifiers{"arr"}},
24812506
&binaryBuiltin{name: "contains", function: builtinContains, params: ast.Identifiers{"arr", "elem"}},
24822507

24832508
// internal

linter/internal/types/stdlib.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,11 @@ func prepareStdlib(g *typeGraph) {
145145
"minArray": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
146146
"maxArray": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
147147
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
148-
// TODO these need test cases written by someone who understands how to make them
149-
"all": g.newSimpleFuncType(boolArrayType, "arr"),
150-
"any": g.newSimpleFuncType(boolArrayType, "arr"),
151-
"remove": g.newSimpleFuncType(anyArrayType, "arr", "elem"),
152-
"removeAt": g.newSimpleFuncType(anyArrayType, "arr", "i"),
148+
"avg": g.newSimpleFuncType(numberType, "arr"),
149+
"all": g.newSimpleFuncType(boolArrayType, "arr"),
150+
"any": g.newSimpleFuncType(boolArrayType, "arr"),
151+
"remove": g.newSimpleFuncType(anyArrayType, "arr", "elem"),
152+
"removeAt": g.newSimpleFuncType(anyArrayType, "arr", "i"),
153153

154154
// Sets
155155

testdata/builtinAvg.golden

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2

testdata/builtinAvg.jsonnet

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.avg([1,2,3])

testdata/builtinAvg.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)