difftreelog
feat foldr over string
in: master
2 files changed
crates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth218 (a, Div, b) => evaluate_div_op(a, b)?,218 (a, Div, b) => evaluate_div_op(a, b)?,219 (a, Mod, b) => evaluate_mod_op(a, b)?,219 (a, Mod, b) => evaluate_mod_op(a, b)?,220220221 (Num(v1), BitAnd, Num(v2)) => Val::try_num((v1.get() as i64 & v2.get() as i64) as f64)?,221 (Num(v1), BitAnd, Num(v2)) => {222 Val::try_num((v1.truncate_for_bitwise()? & v2.truncate_for_bitwise()?) as f64)?223 }222 (Num(v1), BitOr, Num(v2)) => Val::try_num((v1.get() as i64 | v2.get() as i64) as f64)?,224 (Num(v1), BitOr, Num(v2)) => {225 Val::try_num((v1.truncate_for_bitwise()? | v2.truncate_for_bitwise()?) as f64)?226 }223 (Num(v1), BitXor, Num(v2)) => Val::try_num((v1.get() as i64 ^ v2.get() as i64) as f64)?,227 (Num(v1), BitXor, Num(v2)) => {228 Val::try_num((v1.truncate_for_bitwise()? ^ v2.truncate_for_bitwise()?) as f64)?229 }224 (Num(v1), Lhs, Num(v2)) => {230 (Num(v1), Lhs, Num(v2)) => {225 if v2.get() < 0.0 {231 if v2.get() < 0.0 {226 bail!("shift by negative exponent")232 bail!("shift by negative exponent")crates/jrsonnet-stdlib/src/arrays.rsdiffbeforeafterboth--- a/crates/jrsonnet-stdlib/src/arrays.rs
+++ b/crates/jrsonnet-stdlib/src/arrays.rs
@@ -138,19 +138,37 @@
}
#[builtin]
-pub fn builtin_foldl(func: FuncVal, arr: ArrValue, init: Val) -> Result<Val> {
+pub fn builtin_foldl(func: FuncVal, arr: Either![ArrValue, IStr], init: Val) -> Result<Val> {
let mut acc = init;
- for i in arr.iter() {
- acc = func.evaluate_simple(&(acc, i?), false)?;
+ match arr {
+ Either2::A(arr) => {
+ for i in arr.iter() {
+ acc = func.evaluate_simple(&(acc, i?), false)?;
+ }
+ }
+ Either2::B(arr) => {
+ for i in arr.chars() {
+ acc = func.evaluate_simple(&(acc, Val::string(i)), false)?;
+ }
+ }
}
Ok(acc)
}
#[builtin]
-pub fn builtin_foldr(func: FuncVal, arr: ArrValue, init: Val) -> Result<Val> {
+pub fn builtin_foldr(func: FuncVal, arr: Either![ArrValue, IStr], init: Val) -> Result<Val> {
let mut acc = init;
- for i in arr.iter().rev() {
- acc = func.evaluate_simple(&(i?, acc), false)?;
+ match arr {
+ Either2::A(arr) => {
+ for i in arr.iter().rev() {
+ acc = func.evaluate_simple(&(i?, acc), false)?;
+ }
+ }
+ Either2::B(arr) => {
+ for i in arr.chars().rev() {
+ acc = func.evaluate_simple(&(Val::string(i), acc), false)?;
+ }
+ }
}
Ok(acc)
}