From eb8244b349fca4e0db89f718851ad065784135be Mon Sep 17 00:00:00 2001 From: Лач Date: Sun, 19 Jul 2020 13:59:50 +0000 Subject: [PATCH] perf: faster foldl, foldr --- --- a/crates/jrsonnet-evaluator/build.rs +++ b/crates/jrsonnet-evaluator/build.rs @@ -35,7 +35,10 @@ Member::Field(FieldMember { name: FieldName::Fixed(name), .. - }) if **name == *"join" || **name == *"manifestJsonEx" || **name == *"escapeStringJson" || **name == *"equals" || **name == *"base64" + }) + if **name == *"join" || **name == *"manifestJsonEx" || + **name == *"escapeStringJson" || **name == *"equals" || + **name == *"base64" || **name == *"foldl" || **name == *"foldr" ) }) .collect(), --- 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]; ], { -- gitstuff