difftreelog
feat foldr over string
in: master
2 files changed
crates/jrsonnet-evaluator/src/evaluate/operator.rsdiffbeforeafterboth--- a/crates/jrsonnet-evaluator/src/evaluate/operator.rs
+++ b/crates/jrsonnet-evaluator/src/evaluate/operator.rs
@@ -218,9 +218,15 @@
(a, Div, b) => evaluate_div_op(a, b)?,
(a, Mod, b) => evaluate_mod_op(a, b)?,
- (Num(v1), BitAnd, Num(v2)) => Val::try_num((v1.get() as i64 & v2.get() as i64) as f64)?,
- (Num(v1), BitOr, Num(v2)) => Val::try_num((v1.get() as i64 | v2.get() as i64) as f64)?,
- (Num(v1), BitXor, Num(v2)) => Val::try_num((v1.get() as i64 ^ v2.get() as i64) as f64)?,
+ (Num(v1), BitAnd, Num(v2)) => {
+ Val::try_num((v1.truncate_for_bitwise()? & v2.truncate_for_bitwise()?) as f64)?
+ }
+ (Num(v1), BitOr, Num(v2)) => {
+ Val::try_num((v1.truncate_for_bitwise()? | v2.truncate_for_bitwise()?) as f64)?
+ }
+ (Num(v1), BitXor, Num(v2)) => {
+ Val::try_num((v1.truncate_for_bitwise()? ^ v2.truncate_for_bitwise()?) as f64)?
+ }
(Num(v1), Lhs, Num(v2)) => {
if v2.get() < 0.0 {
bail!("shift by negative exponent")
crates/jrsonnet-stdlib/src/arrays.rsdiffbeforeafterboth138}138}139139140#[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}148157149#[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