conjure_cp_core/rule_engine/
rewrite_morph.rs1use itertools::Itertools;
2use tree_morph::{helpers::select_panic, prelude::*};
3
4use crate::{Model, bug};
5
6use super::{RuleSet, get_rules_grouped};
7
8pub fn rewrite_morph<'a>(
10 mut model: Model,
11 rule_sets: &Vec<&'a RuleSet<'a>>,
12 prop_multiple_equally_applicable: bool,
13) -> Model {
14 let submodel = model.as_submodel_mut();
15 let rules_grouped = get_rules_grouped(rule_sets)
16 .unwrap_or_else(|_| bug!("get_rule_priorities() failed!"))
17 .into_iter()
18 .map(|(_, rule)| rule.into_iter().map(|f| f.rule).collect_vec())
19 .collect_vec();
20 let selector = if prop_multiple_equally_applicable {
21 select_panic
22 } else {
23 select_first
24 };
25
26 let engine = EngineBuilder::new()
27 .set_selector(selector)
28 .append_rule_groups(rules_grouped)
29 .build();
30 let (expr, symbol_table) = engine.morph(submodel.root().clone(), submodel.symbols().clone());
31
32 *submodel.symbols_mut() = symbol_table;
33 submodel.replace_root(expr);
34 model
35}