use lex_core::lex::ast::{ContentItem, Document};
pub fn coalesce_blank_line_groups(doc: &mut Document) {
coalesce(doc.root.children.as_mut_vec());
}
fn coalesce(items: &mut Vec<ContentItem>) {
for item in items.iter_mut() {
match item {
ContentItem::Session(s) => coalesce(s.children.as_mut_vec()),
ContentItem::Definition(d) => coalesce(d.children.as_mut_vec()),
ContentItem::ListItem(li) => coalesce(li.children.as_mut_vec()),
ContentItem::List(l) => coalesce(l.items.as_mut_vec()),
ContentItem::Annotation(a) => coalesce(a.children.as_mut_vec()),
ContentItem::Table(t) => {
for row in t.header_rows.iter_mut().chain(t.body_rows.iter_mut()) {
for cell in &mut row.cells {
coalesce(cell.children.as_mut_vec());
}
}
for ann in &mut t.annotations {
coalesce(ann.children.as_mut_vec());
}
if let Some(list) = &mut t.footnotes {
coalesce(list.items.as_mut_vec());
}
}
_ => {}
}
}
let mut out: Vec<ContentItem> = Vec::with_capacity(items.len());
for item in std::mem::take(items) {
if let ContentItem::BlankLineGroup(b) = &item {
if let Some(ContentItem::BlankLineGroup(prev)) = out.last_mut() {
prev.count += b.count;
continue;
}
}
out.push(item);
}
*items = out;
}