Skip to content

Commit 9c0b362

Browse files
authored
feat: implement std.minArray (#685)
* feat: implement std.minArray
1 parent 76e4fc2 commit 9c0b362

File tree

6 files changed

+40
-0
lines changed

6 files changed

+40
-0
lines changed

.DS_Store

10 KB
Binary file not shown.

builtins.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,42 @@ func builtinExtVar(i *interpreter, name value) (value, error) {
19071907
return nil, i.Error("Undefined external variable: " + string(index))
19081908
}
19091909

1910+
func builtinMinArray(i *interpreter, arguments []value) (value, error) {
1911+
arrv := arguments[0]
1912+
keyFv := arguments[1]
1913+
1914+
arr, err := i.getArray(arrv)
1915+
if err != nil {
1916+
return nil, err
1917+
}
1918+
keyF, err := i.getFunction(keyFv)
1919+
if err != nil {
1920+
return nil, err
1921+
}
1922+
num := arr.length()
1923+
if num == 0 {
1924+
return nil, i.Error("Expected at least one element in array. Got none")
1925+
}
1926+
minVal, err := keyF.call(i, args(arr.elements[0]))
1927+
if err != nil {
1928+
return nil, err
1929+
}
1930+
for index := 1; index < num; index++ {
1931+
current, err := keyF.call(i, args(arr.elements[index]))
1932+
if err != nil {
1933+
return nil, err
1934+
}
1935+
cmp, err := valueCmp(i, minVal, current)
1936+
if err != nil {
1937+
return nil, err
1938+
}
1939+
if cmp > 0 {
1940+
minVal = current
1941+
}
1942+
}
1943+
return minVal, nil
1944+
}
1945+
19101946
func builtinNative(i *interpreter, name value) (value, error) {
19111947
str, err := i.getString(name)
19121948
if err != nil {
@@ -2264,6 +2300,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
22642300
&unaryBuiltin{name: "encodeUTF8", function: builtinEncodeUTF8, params: ast.Identifiers{"str"}},
22652301
&unaryBuiltin{name: "decodeUTF8", function: builtinDecodeUTF8, params: ast.Identifiers{"arr"}},
22662302
&generalBuiltin{name: "sort", function: builtinSort, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
2303+
&generalBuiltin{name: "minArray", function: builtinMinArray, params: []generalBuiltinParameter{{name: "arr"}, {name: "keyF", defaultValue: functionID}}},
22672304
&unaryBuiltin{name: "native", function: builtinNative, params: ast.Identifiers{"x"}},
22682305
&unaryBuiltin{name: "sum", function: builtinSum, params: ast.Identifiers{"arr"}},
22692306
&binaryBuiltin{name: "contains", function: builtinContains, params: ast.Identifiers{"arr", "elem"}},

linter/internal/types/stdlib.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ func prepareStdlib(g *typeGraph) {
140140
"sort": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
141141
"uniq": g.newFuncType(anyArrayType, []ast.Parameter{required("arr"), optional("keyF")}),
142142
"sum": g.newSimpleFuncType(numberType, "arr"),
143+
"minArray": g.newSimpleFuncType(anyType, "arr"),
143144
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
144145

145146
// Sets

testdata/builtinMinArray.golden

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

testdata/builtinMinArray.jsonnet

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

testdata/builtinMinArray.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)