1
use itertools::Itertools;
2
use tree_morph::{helpers::select_panic, prelude::*};
3

            
4
use crate::{Model, bug};
5

            
6
use super::{RuleSet, get_rules_grouped};
7

            
8
/// Call the "optimized", tree-morph rewriter.
9
pub 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
}