use std::fmt::Display;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Pair<R> {
pub rule: R,
pub start: usize,
pub end: usize,
pub children: Vec<Self>,
}
impl<R: Clone> Pair<R> {
pub fn convert<S>(&self, converter: &impl Fn(R) -> S) -> Pair<S> {
let Self {
rule,
start,
end,
children,
} = self;
let rule = converter(rule.clone());
let start = *start;
let end = *end;
let children = children
.iter()
.map(|pair| pair.convert(converter))
.collect();
Pair {
rule,
start,
end,
children,
}
}
}
impl<R: crate::RuleType> Display for Pair<R> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}({}, {}, [", self.rule, self.start, self.end,)?;
let mut iter = self.children.iter();
if let Some(first) = iter.next() {
write!(f, "{first}")?;
}
for item in iter {
write!(f, ", {item}")?;
}
write!(f, "])")?;
Ok(())
}
}