From 9c0b362ba71be7ce6bbbc7052732d724f7bd270a Mon Sep 17 00:00:00 2001 From: Deep Goel <34025930+DeepanshuGoel17@users.noreply.github.com> Date: Wed, 3 May 2023 23:43:56 +0530 Subject: [PATCH] feat: implement std.minArray (#685) * feat: implement std.minArray --- .DS_Store | Bin 0 -> 10244 bytes builtins.go | 37 +++++++++++++++++++++++++ linter/internal/types/stdlib.go | 1 + testdata/builtinMinArray.golden | 1 + testdata/builtinMinArray.jsonnet | 1 + testdata/builtinMinArray.linter.golden | 0 6 files changed, 40 insertions(+) create mode 100644 .DS_Store create mode 100644 testdata/builtinMinArray.golden create mode 100644 testdata/builtinMinArray.jsonnet create mode 100644 testdata/builtinMinArray.linter.golden diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1bcb774070a2113dc2fedf251fb9b6e7089d0f17 GIT binary patch literal 10244 zcmeI2ziSjh6vyA*<;UfRkf@k;OT|P@VJEVN69vI0imkbv$wlw7$9Y#o3|z#*C}LwP ziFSgbjsJm_SXf%g6_yr?sA&YhZ)R_I-u}2GMNnbp*nO9IZ{~gGJG-;YUWmwWN5OVHL0nSOu&CRspNPzoG!1*<1=E z+S;>Kz$#!B2o>P;g^dN+vk0^8PBHzz09d^ka7C)lAlDm(gjRX91Gw)SilunHs<@KDu9$7qq3s44dE zA163E^ws=gu~hX-s4IM1_<4VP>+KooFZcA`K-o&in{)jVQ z>VSFMHYWem$&h~s?V>r@O*=U*wcg}0t{Ro)mGtg8=mU?*m}`ZMp*JE)dPP2`j!tO= z`Re#g(RJwNW7e0Upj>4+E;G{Pd3HPG$>`Ud_3fhtucjEH1yDBBJ=avT-H=)hK0shf zl*zfV9&)BeMjG~xlzc7|7Suh%S78H6&c#-%{O9qs7?W*nc(Qx{C;Bqg>lG)s`qexS zVCCX_T9FCGoO8@A{3g%FY{(OfF;vQk5gdaZou^JKps4V*COF8yqc{w|$uWF!s;kQY zuGg>+Qk{> z0*jAN6;B&}(p2LsS?*1Gl*u-+bgHXWN`EF@??}O?pM%V3i&elXU=^?mSOxZ4fxJ%O z^85d@*}wnqHHPiqDqt1(iwZb>#o6Kv0Q76ABniK3cX3?B!G+`6+NvfvaR}F|*YWs+ zU&kK~>Q1ob0>2m7wzjG{>Q!@C)f`s8&EK;h1C0MtvipCY2~|?|>tg3dcK=URv2Xj2 H_y2zYQmOWM literal 0 HcmV?d00001 diff --git a/builtins.go b/builtins.go index 47c918c..add084d 100644 --- a/builtins.go +++ b/builtins.go @@ -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"}}, diff --git a/linter/internal/types/stdlib.go b/linter/internal/types/stdlib.go index 264b1ec..dee12b2 100644 --- a/linter/internal/types/stdlib.go +++ b/linter/internal/types/stdlib.go @@ -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 diff --git a/testdata/builtinMinArray.golden b/testdata/builtinMinArray.golden new file mode 100644 index 0000000..3a2e3f4 --- /dev/null +++ b/testdata/builtinMinArray.golden @@ -0,0 +1 @@ +-1 diff --git a/testdata/builtinMinArray.jsonnet b/testdata/builtinMinArray.jsonnet new file mode 100644 index 0000000..202b8d6 --- /dev/null +++ b/testdata/builtinMinArray.jsonnet @@ -0,0 +1 @@ +std.minArray([1,-1,0]) \ No newline at end of file diff --git a/testdata/builtinMinArray.linter.golden b/testdata/builtinMinArray.linter.golden new file mode 100644 index 0000000..e69de29