use super::*;
impl RegularExpression {
#[tracing::instrument(level = "trace", skip_all)]
pub fn simplify(&self) -> Self {
match self {
RegularExpression::Character(..) => self.clone(),
RegularExpression::Repetition(regex, min, max_opt) => {
regex.simplify().repeat(*min, *max_opt)
}
RegularExpression::Concat(elements) => {
let elements: VecDeque<_> =
elements.iter().map(|element| element.simplify()).collect();
let mut regex = RegularExpression::new_empty_string();
elements
.iter()
.for_each(|element| regex = regex.concat(element, true));
regex
}
RegularExpression::Alternation(elements) => {
let elements: Vec<_> = elements.iter().map(|element| element.simplify()).collect();
RegularExpression::union_all(elements.iter())
}
}
}
}