difftreelog
perf make flatMap builtin
in: master
2 files changed
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth92 ("native".into(), builtin_native),92 ("native".into(), builtin_native),93 ("filter".into(), builtin_filter),93 ("filter".into(), builtin_filter),94 ("map".into(), builtin_map),94 ("map".into(), builtin_map),95 ("flatMap".into(), builtin_flatmap),95 ("foldl".into(), builtin_foldl),96 ("foldl".into(), builtin_foldl),96 ("foldr".into(), builtin_foldr),97 ("foldr".into(), builtin_foldr),97 ("sortImpl".into(), builtin_sort_impl),98 ("sortImpl".into(), builtin_sort_impl),331 })332 })332}333}334335fn builtin_flatmap(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {336 parse_args!(context, "flatMap", args, 2, [337 0, func: ty!(function) => Val::Func;338 1, arr: ty!((array | string));339 ], {340 match arr {341 Val::Str(s) => {342 let mut out = String::new();343 for c in s.chars() {344 match func.evaluate_values(context.clone(), &[Val::Str(c.to_string().into())])? {345 Val::Str(o) => out.push_str(&o),346 _ => throw!(RuntimeError("in std.join all items should be strings".into())),347 };348 }349 Ok(Val::Str(out.into()))350 },351 Val::Arr(a) => {352 let mut out = Vec::new();353 for el in a.iter() {354 let el = el?;355 match func.evaluate_values(context.clone(), &[el])? {356 Val::Arr(o) => for oe in o.iter() {357 out.push(oe?)358 },359 _ => throw!(RuntimeError("in std.join all items should be arrays".into())),360 };361 }362 Ok(Val::Arr(out.into()))363 },364 _ => unreachable!(),365 }366 })367}333368334fn builtin_foldl(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {369fn builtin_foldl(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {335 parse_args!(context, "foldl", args, 3, [370 parse_args!(context, "foldl", args, 3, [crates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth188 else188 else189 { [k]: func(k, obj[k]) for k in std.objectFields(obj) },189 { [k]: func(k, obj[k]) for k in std.objectFields(obj) },190190191 flatMap(func, arr)::191 flatMap:: $intrinsic(flatMap),192 if !std.isFunction(func) then193 error ('std.flatMap first param must be function, got ' + std.type(func))194 else if std.isArray(arr) then195 std.flattenArrays(std.makeArray(std.length(arr), function(i) func(arr[i])))196 else if std.isString(arr) then197 std.join('', std.makeArray(std.length(arr), function(i) func(arr[i])))198 else error ('std.flatMap second param must be array / string, got ' + std.type(arr)),199192200 join:: $intrinsic(join),193 join:: $intrinsic(join),201194