git.delta.rocks / jrsonnet / refs/commits / 46b4dd0e38ba

difftreelog

perf make flatMap builtin

Yaroslav Bolyukin2021-07-12parent: #81202f5.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth
92 ("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}
334
335fn 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}
333368
334fn 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, [
modifiedcrates/jrsonnet-stdlib/src/std.jsonnetdiffbeforeafterboth
--- a/crates/jrsonnet-stdlib/src/std.jsonnet
+++ b/crates/jrsonnet-stdlib/src/std.jsonnet
@@ -188,14 +188,7 @@
     else
       { [k]: func(k, obj[k]) for k in std.objectFields(obj) },
 
-  flatMap(func, arr)::
-    if !std.isFunction(func) then
-      error ('std.flatMap first param must be function, got ' + std.type(func))
-    else if std.isArray(arr) then
-      std.flattenArrays(std.makeArray(std.length(arr), function(i) func(arr[i])))
-    else if std.isString(arr) then
-      std.join('', std.makeArray(std.length(arr), function(i) func(arr[i])))
-    else error ('std.flatMap second param must be array / string, got ' + std.type(arr)),
+  flatMap:: $intrinsic(flatMap),
 
   join:: $intrinsic(join),