1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use crate::elements::accent::ExpressionAccent;
use crate::elements::group::Group;
use crate::elements::literal::Literal;
use crate::elements::special::Special;
use crate::utils::Boxed;

pub mod accent;
pub mod group;
pub mod literal;
pub mod special;

#[derive(Debug, Clone, PartialOrd, PartialEq)]
pub enum Element {
    Literal(Literal),
    Special(Special),
    Group(Group),
    Accent(ExpressionAccent),
}

impl Boxed for Element {}

impl Element {
    pub fn to_non_enclosed(&self) -> Self {
        if let Element::Group(g) = self {
            if let Some(ne) = g.to_non_enclosed() {
                Element::Group(ne)
            } else {
                Element::Group(g.clone())
            }
        } else {
            self.clone()
        }
    }
}