difftreelog
perf faster std.map
in: master
3 files changed
crates/jrsonnet-evaluator/build.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/build.rs
+++ b/crates/jrsonnet-evaluator/build.rs
@@ -40,7 +40,7 @@
name == "base64" || name == "foldl" || name == "foldr" ||
name == "sortImpl" || name == "format" || name == "range" ||
name == "reverse" || name == "slice" || name == "mod" ||
- name == "strReplace"
+ name == "strReplace" || name == "map"
)
})
.collect(),
crates/jrsonnet-evaluator/src/builtin/mod.rsdiffbeforeafterboth57 ("extVar".into(), builtin_ext_var),57 ("extVar".into(), builtin_ext_var),58 ("native".into(), builtin_native),58 ("native".into(), builtin_native),59 ("filter".into(), builtin_filter),59 ("filter".into(), builtin_filter),60 ("map".into(), builtin_map),60 ("foldl".into(), builtin_foldl),61 ("foldl".into(), builtin_foldl),61 ("foldr".into(), builtin_foldr),62 ("foldr".into(), builtin_foldr),62 ("sortImpl".into(), builtin_sort_impl),63 ("sortImpl".into(), builtin_sort_impl),294 0, func: ty!(function) => Val::Func;295 0, func: ty!(function) => Val::Func;295 1, arr: ty!(array) => Val::Arr;296 1, arr: ty!(array) => Val::Arr;296 ], {297 ], {297 let mut out = Vec::new();298 Ok(Val::Arr(arr.filter(|val| func298 for item in arr.iter() {299 let item = item?;300 if func301 .evaluate_values(context.clone(), &[item.clone()])?299 .evaluate_values(context.clone(), &[val.clone()])?302 .try_cast_bool("filter predicate")? {300 .try_cast_bool("filter predicate"))?))303 out.push(item);304 }305 }306 Ok(Val::Arr(out.into()))307 })301 })308}302}303304fn builtin_map(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {305 parse_args!(context, "map", args, 2, [306 0, func: ty!(function) => Val::Func;307 1, arr: ty!(array) => Val::Arr;308 ], {309 Ok(Val::Arr(arr.map(|val| func310 .evaluate_values(context.clone(), &[val]))?))311 })312}309313310fn builtin_foldl(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {314fn builtin_foldl(context: Context, _loc: Option<&ExprLocation>, args: &ArgsDesc) -> Result<Val> {311 parse_args!(context, "foldl", args, 3, [315 parse_args!(context, "foldl", args, 3, [crates/jrsonnet-evaluator/src/val.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/val.rs
+++ b/crates/jrsonnet-evaluator/src/val.rs
@@ -283,6 +283,29 @@
}
}
+ pub fn map(self, mapper: impl Fn(Val) -> Result<Val>) -> Result<Self> {
+ let mut out = Vec::with_capacity(self.len());
+
+ for value in self.iter() {
+ out.push(mapper(value?)?);
+ }
+
+ Ok(Self::Eager(Rc::new(out)))
+ }
+
+ pub fn filter(self, filter: impl Fn(&Val) -> Result<bool>) -> Result<Self> {
+ let mut out = Vec::with_capacity(self.len());
+
+ for value in self.iter() {
+ let value = value?;
+ if filter(&value)? {
+ out.push(value);
+ }
+ }
+
+ Ok(Self::Eager(Rc::new(out)))
+ }
+
pub fn ptr_eq(a: &Self, b: &Self) -> bool {
match (a, b) {
(Self::Lazy(a), Self::Lazy(b)) => Rc::ptr_eq(a, b),