use super::Sink;
pub(super) struct OutputQueue<D> {
offset: usize,
nodes: Vec<Option<D>>,
}
impl<D> OutputQueue<D> {
pub(super) fn new() -> Self {
Self {
offset: 0,
nodes: vec![],
}
}
pub(super) fn insert(&mut self, id: usize, node: D) {
let actual_idx = id - self.offset;
while self.nodes.len() <= actual_idx {
self.nodes.push(None);
}
self.nodes[actual_idx] = Some(node);
}
pub(super) fn output_to<S>(&mut self, sink: &mut S) -> Result<(), S::Error>
where
S: Sink<D>,
{
self.offset += self.nodes.len();
for node in self.nodes.drain(..) {
sink.add_match(node.expect("output_to called only after all matches are complete"))?;
}
Ok(())
}
}