Path: blob/main/crates/polars-plan/src/plans/aexpr/minterm_iter.rs
6940 views
use polars_utils::arena::{Arena, Node};1use polars_utils::idx_vec::UnitVec;2use polars_utils::unitvec;34use super::{AExpr, Operator};56/// An iterator over all the minterms in a boolean expression boolean.7///8/// In other words, all the terms that can `AND` together to form this expression.9///10/// # Example11///12/// ```13/// a & (b | c) & (b & (c | (a & c)))14/// ```15///16/// Gives terms:17///18/// ```19/// a20/// b | c21/// b22/// c | (a & c)23/// ```24pub struct MintermIter<'a> {25stack: UnitVec<Node>,26expr_arena: &'a Arena<AExpr>,27}2829impl Iterator for MintermIter<'_> {30type Item = Node;3132fn next(&mut self) -> Option<Self::Item> {33let mut top = self.stack.pop()?;3435while let AExpr::BinaryExpr {36left,37op: Operator::And | Operator::LogicalAnd,38right,39} = self.expr_arena.get(top)40{41self.stack.push(*right);42top = *left;43}4445Some(top)46}47}4849impl<'a> MintermIter<'a> {50pub fn new(root: Node, expr_arena: &'a Arena<AExpr>) -> Self {51Self {52stack: unitvec![root],53expr_arena,54}55}56}575859