Skip to content

Commit 25d3372

Browse files
feat: implement std.remove and std.removeAt (#689)
* feat: implement std.remove and std.removeAt * Update builtins.go --------- Co-authored-by: Dave Cunningham <[email protected]>
1 parent 3c7c0cb commit 25d3372

File tree

8 files changed

+49
-0
lines changed

8 files changed

+49
-0
lines changed

builtins.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1990,6 +1990,41 @@ func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
19901990
return makeValueBoolean(false), nil
19911991
}
19921992

1993+
func builtinRemove(i *interpreter, arrv value, ev value) (value, error) {
1994+
arr, err := i.getArray(arrv)
1995+
if err != nil {
1996+
return nil, err
1997+
}
1998+
for idx, elem := range arr.elements {
1999+
val, err := elem.getValue(i)
2000+
if err != nil {
2001+
return nil, err
2002+
}
2003+
eq, err := rawEquals(i, val, ev)
2004+
if err != nil {
2005+
return nil, err
2006+
}
2007+
if eq {
2008+
return builtinRemoveAt(i, arrv, intToValue(idx))
2009+
}
2010+
}
2011+
return arr, nil
2012+
}
2013+
2014+
func builtinRemoveAt(i *interpreter, arrv value, idxv value) (value, error) {
2015+
arr, err := i.getArray(arrv)
2016+
if err != nil {
2017+
return nil, err
2018+
}
2019+
idx, err := i.getInt(idxv)
2020+
if err != nil {
2021+
return nil, err
2022+
}
2023+
2024+
newArr := append(arr.elements[:idx], arr.elements[idx+1:]...)
2025+
return makeValueArray(newArr), nil
2026+
}
2027+
19932028
func builtInObjectRemoveKey(i *interpreter, objv value, keyv value) (value, error) {
19942029
obj, err := i.getObject(objv)
19952030
if err != nil {
@@ -2286,6 +2321,8 @@ var funcBuiltins = buildBuiltinMap([]builtin{
22862321
&ternaryBuiltin{name: "foldl", function: builtinFoldl, params: ast.Identifiers{"func", "arr", "init"}},
22872322
&ternaryBuiltin{name: "foldr", function: builtinFoldr, params: ast.Identifiers{"func", "arr", "init"}},
22882323
&binaryBuiltin{name: "member", function: builtinMember, params: ast.Identifiers{"arr", "x"}},
2324+
&binaryBuiltin{name: "remove", function: builtinRemove, params: ast.Identifiers{"arr", "elem"}},
2325+
&binaryBuiltin{name: "removeAt", function: builtinRemoveAt, params: ast.Identifiers{"arr", "i"}},
22892326
&binaryBuiltin{name: "range", function: builtinRange, params: ast.Identifiers{"from", "to"}},
22902327
&binaryBuiltin{name: "primitiveEquals", function: primitiveEquals, params: ast.Identifiers{"x", "y"}},
22912328
&binaryBuiltin{name: "equals", function: builtinEquals, params: ast.Identifiers{"x", "y"}},

linter/internal/types/stdlib.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ func prepareStdlib(g *typeGraph) {
142142
"sum": g.newSimpleFuncType(numberType, "arr"),
143143
"minArray": g.newSimpleFuncType(anyType, "arr"),
144144
"contains": g.newSimpleFuncType(boolType, "arr", "elem"),
145+
"remove": g.newSimpleFuncType(anyArrayType, "arr", "elem"),
146+
"removeAt": g.newSimpleFuncType(anyArrayType, "arr", "i"),
145147

146148
// Sets
147149

testdata/builtinRemove.golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
1,
3+
3
4+
]

testdata/builtinRemove.jsonnet

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

testdata/builtinRemove.linter.golden

Whitespace-only changes.

testdata/builtinRemoveAt.golden

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[
2+
1,
3+
3
4+
]

testdata/builtinRemoveAt.jsonnet

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

testdata/builtinRemoveAt.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)