Skip to content

Commit

Permalink
feat: implement std.maxArray (#696)
Browse files Browse the repository at this point in the history
  • Loading branch information
deepgoel17 committed May 25, 2023
1 parent 4bb6e38 commit 7edd5d3
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 1 deletion.
37 changes: 37 additions & 0 deletions builtins.go
Original file line number Diff line number Diff line change
Expand Up @@ -1953,6 +1953,42 @@ func builtinMinArray(i *interpreter, arguments []value) (value, error) {
return minVal, nil
}

func builtinMaxArray(i *interpreter, arguments []value) (value, error) {
arrv := arguments[0]
keyFv := arguments[1]

arr, err := i.getArray(arrv)
if err != nil {
return nil, err
}
keyF, err := i.getFunction(keyFv)
if err != nil {
return nil, err
}
num := arr.length()
if num == 0 {
return nil, i.Error("Expected at least one element in array. Got none")
}
maxVal, err := keyF.call(i, args(arr.elements[0]))
if err != nil {
return nil, err
}
for index := 1; index < num; index++ {
current, err := keyF.call(i, args(arr.elements[index]))
if err != nil {
return nil, err
}
cmp, err := valueCmp(i, maxVal, current)
if err != nil {
return nil, err
}
if cmp < 0 {
maxVal = current
}
}
return maxVal, nil
}

func builtinNative(i *interpreter, name value) (value, error) {
str, err := i.getString(name)
if err != nil {
Expand Down Expand Up @@ -2385,6 +2421,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
&unaryBuiltin{name: "decodeUTF8", function: builtinDecodeUTF8, params: ast.Identifiers{"arr"}},
&generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
&generalBuiltin{name: "minArray", function: builtinMinArray, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
&generalBuiltin{name: "maxArray", function: builtinMaxArray, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
&unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}},
&unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}},
&binaryBuiltin{name: "contains", function: builtinContains, params: ast.Identifiers{"arr", "elem"}},
Expand Down
3 changes: 2 additions & 1 deletion linter/internal/types/stdlib.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,8 @@ func prepareStdlib(g *typeGraph) {
"sort": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
"uniq": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
"sum": g.newSimpleFuncType(numberType, "arr"),
"minArray": g.newSimpleFuncType(anyType, "arr"),
"minArray": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
"maxArray": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
"remove": g.newSimpleFuncType(anyArrayType, "arr", "elem"),
"removeAt": g.newSimpleFuncType(anyArrayType, "arr", "i"),
Expand Down
1 change: 1 addition & 0 deletions testdata/builtinMaxArray.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1
1 change: 1 addition & 0 deletions testdata/builtinMaxArray.jsonnet
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
std.maxArray([1,-1,0])
Empty file.

0 comments on commit 7edd5d3

Please sign in to comment.