haloumi-picus 0.5.6

Haloumi backend to the Picus Constraint Language.
Documentation
use haloumi_ir::Prime;

use crate::pcl::{
    Program,
    expr::{Expr, traits::ExprLike},
    opt::{MutOptResult, MutOptimizer, OptResult, Optimizer},
    vars::VarKind,
};

#[derive(Default, Debug)]
pub struct FoldExprsPass;

impl<K: VarKind + Copy> MutOptimizer<Program<K>> for FoldExprsPass {
    fn optimize(&mut self, t: &mut Program<K>) -> MutOptResult {
        let prime = t.prime().clone();
        let mut inner = FoldExprsPassImpl(prime);
        let opt: &mut dyn MutOptimizer<Program<K>> = &mut inner;
        opt.optimize(t)
    }
}

#[derive(Debug)]
struct FoldExprsPassImpl(Prime);

impl Optimizer<dyn ExprLike, Expr> for FoldExprsPassImpl {
    fn optimize(&mut self, i: &dyn ExprLike) -> OptResult<Expr> {
        Ok(i.fold(self.0).unwrap_or_else(|| i.wrap()))
    }
}