vortex_expr/transform/
simplify.rsuse vortex_error::VortexResult;
use crate::traversal::{MutNodeVisitor, Node, TransformResult};
use crate::{ExprRef, GetItem, Pack};
pub fn simplify(e: ExprRef) -> VortexResult<ExprRef> {
let mut folder = Simplify;
e.transform(&mut folder).map(|e| e.result)
}
struct Simplify;
impl MutNodeVisitor for Simplify {
type NodeTy = ExprRef;
fn visit_up(&mut self, node: Self::NodeTy) -> VortexResult<TransformResult<ExprRef>> {
if let Some(get_item) = node.as_any().downcast_ref::<GetItem>() {
if let Some(pack) = get_item.child().as_any().downcast_ref::<Pack>() {
let expr = pack.field(get_item.field())?;
return Ok(TransformResult::yes(expr));
}
}
Ok(TransformResult::no(node))
}
}
#[cfg(test)]
mod tests {
use crate::transform::simplify::simplify;
use crate::{get_item, lit, pack};
#[test]
fn test_simplify() {
let e = get_item("b", pack([("a", lit(1)), ("b", lit(2))]));
let e = simplify(e).unwrap();
assert_eq!(&e, &lit(2));
}
}