feat: implement std.remove and std.removeAt (#689)

* feat: implement std.remove and std.removeAt

* Update builtins.go

---------

Co-authored-by: Dave Cunningham <sparkprime@gmail.com>
This commit is contained in:
Rohit Jangid 2023-05-25 18:02:21 +05:30 committed by GitHub
parent 3c7c0cbac8
commit 25d3372c98
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 49 additions and 0 deletions

View File

@ -1990,6 +1990,41 @@ func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
return makeValueBoolean(false), nil
}
func builtinRemove(i *interpreter, arrv value, ev value) (value, error) {
arr, err := i.getArray(arrv)
if err != nil {
return nil, err
}
for idx, elem := range arr.elements {
val, err := elem.getValue(i)
if err != nil {
return nil, err
}
eq, err := rawEquals(i, val, ev)
if err != nil {
return nil, err
}
if eq {
return builtinRemoveAt(i, arrv, intToValue(idx))
}
}
return arr, nil
}
func builtinRemoveAt(i *interpreter, arrv value, idxv value) (value, error) {
arr, err := i.getArray(arrv)
if err != nil {
return nil, err
}
idx, err := i.getInt(idxv)
if err != nil {
return nil, err
}
newArr := append(arr.elements[:idx], arr.elements[idx+1:]...)
return makeValueArray(newArr), nil
}
func builtInObjectRemoveKey(i *interpreter, objv value, keyv value) (value, error) {
obj, err := i.getObject(objv)
if err != nil {
@ -2286,6 +2321,8 @@ var funcBuiltins = buildBuiltinMap([]builtin{
&ternaryBuiltin{name: "foldl", function: builtinFoldl, params: ast.Identifiers{"func", "arr", "init"}},
&ternaryBuiltin{name: "foldr", function: builtinFoldr, params: ast.Identifiers{"func", "arr", "init"}},
&binaryBuiltin{name: "member", function: builtinMember, params: ast.Identifiers{"arr", "x"}},
&binaryBuiltin{name: "remove", function: builtinRemove, params: ast.Identifiers{"arr", "elem"}},
&binaryBuiltin{name: "removeAt", function: builtinRemoveAt, params: ast.Identifiers{"arr", "i"}},
&binaryBuiltin{name: "range", function: builtinRange, params: ast.Identifiers{"from", "to"}},
&binaryBuiltin{name: "primitiveEquals", function: primitiveEquals, params: ast.Identifiers{"x", "y"}},
&binaryBuiltin{name: "equals", function: builtinEquals, params: ast.Identifiers{"x", "y"}},

View File

@ -142,6 +142,8 @@ func prepareStdlib(g *typeGraph) {
"sum": g.newSimpleFuncType(numberType, "arr"),
"minArray": g.newSimpleFuncType(anyType, "arr"),
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
"remove": g.newSimpleFuncType(anyArrayType, "arr", "elem"),
"removeAt": g.newSimpleFuncType(anyArrayType, "arr", "i"),
// Sets

4
testdata/builtinRemove.golden vendored Normal file
View File

@ -0,0 +1,4 @@
[
1,
3
]

1
testdata/builtinRemove.jsonnet vendored Normal file
View File

@ -0,0 +1 @@
std.remove([1,2,3],2)

0
testdata/builtinRemove.linter.golden vendored Normal file
View File

4
testdata/builtinRemoveAt.golden vendored Normal file
View File

@ -0,0 +1,4 @@
[
1,
3
]

1
testdata/builtinRemoveAt.jsonnet vendored Normal file
View File

@ -0,0 +1 @@
std.removeAt([1,2,3],1)

View File