feat: implement std.minArray (#685)

* feat: implement std.minArray
This commit is contained in:
Deep Goel 2023-05-03 23:43:56 +05:30 committed by GitHub
parent 76e4fc2221
commit 9c0b362ba7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -1907,6 +1907,42 @@ func builtinExtVar(i *interpreter, name value) (value, error) {
return nil, i.Error("Undefined external variable: " + string(index))
}
func builtinMinArray(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")
}
minVal, 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, minVal, current)
if err != nil {
return nil, err
}
if cmp > 0 {
minVal = current
}
}
return minVal, nil
}
func builtinNative(i *interpreter, name value) (value, error) {
str, err := i.getString(name)
if err != nil {
@ -2264,6 +2300,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
&unaryBuiltin{name: "encodeUTF8", function: builtinEncodeUTF8, params: ast.Identifiers{"str"}},
&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}}},
&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"}},

View File

@ -140,6 +140,7 @@ 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"),
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
// Sets

1
testdata/builtinMinArray.golden vendored Normal file
View File

@ -0,0 +1 @@
-1

1
testdata/builtinMinArray.jsonnet vendored Normal file
View File

@ -0,0 +1 @@
std.minArray([1,-1,0])

View File