1use crate::arena::Arena;
2
3#[derive(Default, Debug)]
5pub struct Emitter {
6 start_len: Option<usize>,
7}
8
9impl Emitter {
10 pub fn start(&mut self, arena: &Arena<crate::Expression>) {
11 if self.start_len.is_some() {
12 unreachable!("Emitting has already started!");
13 }
14 self.start_len = Some(arena.len());
15 }
16 pub const fn is_running(&self) -> bool {
17 self.start_len.is_some()
18 }
19 #[must_use]
20 pub fn finish(
21 &mut self,
22 arena: &Arena<crate::Expression>,
23 ) -> Option<(crate::Statement, crate::span::Span)> {
24 let start_len = self.start_len.take().unwrap();
25 if start_len != arena.len() {
26 let mut span = crate::span::Span::default();
27 let range = arena.range_from(start_len);
28 for handle in range.clone() {
29 span.subsume(arena.get_span(handle))
30 }
31 Some((crate::Statement::Emit(range), span))
32 } else {
33 None
34 }
35 }
36}