@@ -1992,6 +1992,47 @@ func builtinExtVar(i *interpreter, name value) (value, error) {
1992
1992
return nil , i .Error ("Undefined external variable: " + string (index ))
1993
1993
}
1994
1994
1995
+ func builtinGroupBy (i * interpreter , arguments []value ) (value , error ) {
1996
+ arrv := arguments [0 ]
1997
+ keyFv := arguments [1 ]
1998
+
1999
+ arr , err := i .getArray (arrv )
2000
+ if err != nil {
2001
+ return nil , err
2002
+ }
2003
+ keyF , err := i .getFunction (keyFv )
2004
+ if err != nil {
2005
+ return nil , err
2006
+ }
2007
+ json := make (map [string ]interface {})
2008
+ for _ , thunk := range arr .elements {
2009
+ currentValue , err := keyF .call (i , args (thunk ))
2010
+ if err != nil {
2011
+ return nil , err
2012
+ }
2013
+ toStrVal , err := builtinToString (i , currentValue )
2014
+ if err != nil {
2015
+ return nil , err
2016
+ }
2017
+ strVal , err := i .getString (toStrVal )
2018
+ if err != nil {
2019
+ return nil , err
2020
+ }
2021
+ thunkValue , err := thunk .getValue (i )
2022
+ if err != nil {
2023
+ return nil , err
2024
+ }
2025
+
2026
+ if json [strVal .getGoString ()] == nil {
2027
+ json [strVal .getGoString ()] = []interface {}{thunkValue }
2028
+ } else {
2029
+ temp := json [strVal .getGoString ()].([]interface {})
2030
+ json [strVal .getGoString ()] = append (temp , thunkValue )
2031
+ }
2032
+ }
2033
+ return jsonToValue (i , json )
2034
+ }
2035
+
1995
2036
func builtinMinArray (i * interpreter , arguments []value ) (value , error ) {
1996
2037
arrv := arguments [0 ]
1997
2038
keyFv := arguments [1 ]
@@ -2530,6 +2571,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
2530
2571
& generalBuiltin {name : "sort" , function : builtinSort , params : []generalBuiltinParameter {{name : "arr" }, {name : "keyF" , defaultValue : functionID }}},
2531
2572
& generalBuiltin {name : "minArray" , function : builtinMinArray , params : []generalBuiltinParameter {{name : "arr" }, {name : "keyF" , defaultValue : functionID }}},
2532
2573
& generalBuiltin {name : "maxArray" , function : builtinMaxArray , params : []generalBuiltinParameter {{name : "arr" }, {name : "keyF" , defaultValue : functionID }}},
2574
+ & generalBuiltin {name : "groupBy" , function : builtinGroupBy , params : []generalBuiltinParameter {{name : "arr" }, {name : "keyF" , defaultValue : functionID }}},
2533
2575
& unaryBuiltin {name : "native" , function : builtinNative , params : ast.Identifiers {"x" }},
2534
2576
& unaryBuiltin {name : "sum" , function : builtinSum , params : ast.Identifiers {"arr" }},
2535
2577
& unaryBuiltin {name : "avg" , function : builtinAvg , params : ast.Identifiers {"arr" }},
0 commit comments