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

difftreelog

feat foldr over string

xrqmywmqYaroslav Bolyukin2026-02-08parent: #298a278.patch.diff
in: master

2 files changed

modifiedcrates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth
218 (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)?,
220220
221 (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")
modifiedcrates/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)
 }