use crate::ir::ast::{ClassDefinition, Equation, Expression};
pub fn expand_tuple_equations(class: &mut ClassDefinition) {
let mut new_equations = Vec::new();
for eq in &class.equations {
if let Equation::Simple { lhs, rhs } = eq {
if let (
Expression::Tuple {
elements: lhs_elems,
},
Expression::Tuple {
elements: rhs_elems,
},
) = (lhs, rhs)
{
if lhs_elems.len() == rhs_elems.len() {
for (l, r) in lhs_elems.iter().zip(rhs_elems.iter()) {
new_equations.push(Equation::Simple {
lhs: l.clone(),
rhs: r.clone(),
});
}
} else {
new_equations.push(eq.clone());
}
} else {
new_equations.push(eq.clone());
}
} else {
new_equations.push(eq.clone());
}
}
class.equations = new_equations;
let mut new_initial_equations = Vec::new();
for eq in &class.initial_equations {
if let Equation::Simple { lhs, rhs } = eq {
if let (
Expression::Tuple {
elements: lhs_elems,
},
Expression::Tuple {
elements: rhs_elems,
},
) = (lhs, rhs)
{
if lhs_elems.len() == rhs_elems.len() {
for (l, r) in lhs_elems.iter().zip(rhs_elems.iter()) {
new_initial_equations.push(Equation::Simple {
lhs: l.clone(),
rhs: r.clone(),
});
}
} else {
new_initial_equations.push(eq.clone());
}
} else {
new_initial_equations.push(eq.clone());
}
} else {
new_initial_equations.push(eq.clone());
}
}
class.initial_equations = new_initial_equations;
}