use std::mem;
use toasty_core::stmt::{self, Expr};
pub(super) fn fold_expr_or(expr: &mut stmt::ExprOr) -> Option<Expr> {
for i in 0..expr.operands.len() {
if let Expr::Or(or) = &mut expr.operands[i] {
let mut nested = mem::take(&mut or.operands);
expr.operands[i] = false.into();
expr.operands.append(&mut nested);
}
}
if expr.operands.iter().any(|e| e.is_true()) {
return Some(true.into());
}
expr.operands.retain(|operand| !operand.is_false());
if !expr.operands.is_empty() && expr.operands.iter().all(|e| e.is_value_null()) {
return Some(Expr::null());
}
if expr.operands.is_empty() {
Some(false.into())
} else if expr.operands.len() == 1 {
Some(expr.operands.remove(0))
} else {
None
}
}