@@ -1907,6 +1907,42 @@ func builtinExtVar(i *interpreter, name value) (value, error) {
1907
1907
return nil , i .Error ("Undefined external variable: " + string (index ))
1908
1908
}
1909
1909
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
+
1910
1946
func builtinNative (i * interpreter , name value ) (value , error ) {
1911
1947
str , err := i .getString (name )
1912
1948
if err != nil {
@@ -2264,6 +2300,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
2264
2300
& unaryBuiltin {name : "encodeUTF8" , function : builtinEncodeUTF8 , params : ast.Identifiers {"str" }},
2265
2301
& unaryBuiltin {name : "decodeUTF8" , function : builtinDecodeUTF8 , params : ast.Identifiers {"arr" }},
2266
2302
& 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 }}},
2267
2304
& unaryBuiltin {name : "native" , function : builtinNative , params : ast.Identifiers {"x" }},
2268
2305
& unaryBuiltin {name : "sum" , function : builtinSum , params : ast.Identifiers {"arr" }},
2269
2306
& binaryBuiltin {name : "contains" , function : builtinContains , params : ast.Identifiers {"arr" , "elem" }},
0 commit comments