use crate::mapper_impls::equality::are_structurally_equal;
use crate::primitives::Expression;
use crate::{define_binary_op, impl_scalar_to_expr};
use std::iter::IntoIterator;
use std::rc::Rc;
impl PartialEq for Expression {
fn eq(&self, other: &Self) -> bool {
are_structurally_equal(self, other)
}
}
pub trait ConvertibleToExpr {
fn to_expr(&self) -> Rc<Expression>;
}
impl ConvertibleToExpr for Rc<Expression> {
fn to_expr(&self) -> Rc<Expression> {
self.clone()
}
}
impl_scalar_to_expr!(i32);
impl_scalar_to_expr!(f64);
define_binary_op!(add, Sum);
define_binary_op!(mul, Product);
define_binary_op!(div, Divide);
define_binary_op!(floor_div, FloorDiv);
define_binary_op!(modulo, Modulo);
define_binary_op!(less, Less);
define_binary_op!(less_equal, LessEqual);
define_binary_op!(greater, Greater);
define_binary_op!(greater_equal, GreaterEqual);
define_binary_op!(equal, Equal);
define_binary_op!(not_equal, GreaterEqual);
define_binary_op!(left_shift, LeftShift);
define_binary_op!(right_shift, RightShift);
pub fn index<T: IntoIterator<Item = Rc<Expression>>>(agg: Rc<Expression>, indices: T)
-> Rc<Expression> {
let vec_indices = indices.into_iter().collect();
Rc::new(Expression::Subscript(agg.clone(), vec_indices))
}
pub fn ifthenelse(cond: Rc<Expression>, then: Rc<Expression>, else_: Rc<Expression>)
-> Rc<Expression> {
Rc::new(Expression::If(cond.clone(), then.clone(), else_.clone()))
}