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
138}138}
139139
140#[builtin]140#[builtin]
141pub fn builtin_foldl(func: FuncVal, arr: ArrValue, init: Val) -> Result<Val> {141pub fn builtin_foldl(func: FuncVal, arr: Either![ArrValue, IStr], init: Val) -> Result<Val> {
142 let mut acc = init;142 let mut acc = init;
143 match arr {
144 Either2::A(arr) => {
143 for i in arr.iter() {145 for i in arr.iter() {
144 acc = func.evaluate_simple(&(acc, i?), false)?;146 acc = func.evaluate_simple(&(acc, i?), false)?;
145 }147 }
148 }
149 Either2::B(arr) => {
150 for i in arr.chars() {
151 acc = func.evaluate_simple(&(acc, Val::string(i)), false)?;
152 }
153 }
154 }
146 Ok(acc)155 Ok(acc)
147}156}
148157
149#[builtin]158#[builtin]
150pub fn builtin_foldr(func: FuncVal, arr: ArrValue, init: Val) -> Result<Val> {159pub fn builtin_foldr(func: FuncVal, arr: Either![ArrValue, IStr], init: Val) -> Result<Val> {
151 let mut acc = init;160 let mut acc = init;
161 match arr {
162 Either2::A(arr) => {
152 for i in arr.iter().rev() {163 for i in arr.iter().rev() {
153 acc = func.evaluate_simple(&(i?, acc), false)?;164 acc = func.evaluate_simple(&(i?, acc), false)?;
154 }165 }
166 }
167 Either2::B(arr) => {
168 for i in arr.chars().rev() {
169 acc = func.evaluate_simple(&(Val::string(i), acc), false)?;
170 }
171 }
172 }
155 Ok(acc)173 Ok(acc)
156}174}
157175