git.delta.rocks / jrsonnet / refs/commits / eb8244b349fc

difftreelog

perf faster foldl, foldr

Лач2020-07-19parent: #36ab91f.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/build.rsdiffbeforeafterboth
38 }) if **name == *"join" || **name == *"manifestJsonEx" || **name == *"escapeStringJson" || **name == *"equals" || **name == *"base64"38 })
39 if **name == *"join" || **name == *"manifestJsonEx" ||
40 **name == *"escapeStringJson" || **name == *"equals" ||
41 **name == *"base64" || **name == *"foldl" || **name == *"foldr"
39 )42 )
40 })43 })
41 .collect(),44 .collect(),
modifiedcrates/jrsonnet-evaluator/src/evaluate.rsdiffbeforeafterboth
--- a/crates/jrsonnet-evaluator/src/evaluate.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate.rs
@@ -557,6 +557,30 @@
 						.collect(),
 				)))
 			}))?,
+			// faster
+			("std", "foldl") => noinline!(parse_args!(context, "std.foldl", args, 3, [
+				0, func: [Val::Func]!!Val::Func, vec![ValType::Func];
+				1, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];
+				2, init, vec![];
+			], {
+				let mut acc = init;
+				for i in arr.iter().cloned() {
+					acc = func.evaluate_values(context.clone(), &[acc, i])?;
+				}
+				Ok(acc)
+			}))?,
+			// faster
+			("std", "foldr") => noinline!(parse_args!(context, "std.foldr", args, 3, [
+				0, func: [Val::Func]!!Val::Func, vec![ValType::Func];
+				1, arr: [Val::Arr]!!Val::Arr, vec![ValType::Arr];
+				2, init, vec![];
+			], {
+				let mut acc = init;
+				for i in arr.iter().rev().cloned() {
+					acc = func.evaluate_values(context.clone(), &[acc, i])?;
+				}
+				Ok(acc)
+			}))?,
 			("std", "char") => parse_args!(context, "std.char", args, 1, [
 				0, n: [Val::Num]!!Val::Num, vec![ValType::Num];
 			], {