| 237 | } |
| 238 | |
| 239 | fn fold(helper: &MyHelper, init: Exp, vs: Vec<IDLValue>, func: &str) -> Result<IDLValue> { |
| 240 | let init = init.eval(helper)?; |
| 241 | let mut new_helper = helper.spawn(); |
| 242 | let mut acc = init; |
| 243 | for v in vs.into_iter() { |
| 244 | new_helper.env.0.insert(String::new(), v); |
| 245 | let arg = Exp::Path(String::new(), Vec::new()); |
| 246 | new_helper.env.0.insert("_".to_string(), acc.clone()); |
| 247 | let accu = Exp::Path("_".to_string(), Vec::new()); |
| 248 | let exp = Exp::Apply(func.to_string(), vec![accu, arg]); |
| 249 | acc = exp.eval(&new_helper)?; |
| 250 | } |
| 251 | Ok(acc) |
| 252 | } |