@@ -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+
19101946func 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" }},
0 commit comments