Implement all ast node iteration.
This commit is contained in:
102
src/iter/all_ast_node_iter.rs
Normal file
102
src/iter/all_ast_node_iter.rs
Normal file
@@ -0,0 +1,102 @@
|
||||
use std::collections::VecDeque;
|
||||
|
||||
use super::ast_node::AstNode;
|
||||
use super::ast_node_iter::AstNodeIter;
|
||||
|
||||
pub struct AllAstNodeIter<'r, 's> {
|
||||
root: Option<AstNode<'r, 's>>,
|
||||
queue: VecDeque<AstNodeIter<'r, 's>>,
|
||||
}
|
||||
|
||||
impl<'r, 's> Iterator for AllAstNodeIter<'r, 's> {
|
||||
type Item = AstNode<'r, 's>;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
if let Some(root) = self.root.take() {
|
||||
self.queue.push_back(AstNodeIter::from_ast_node(&root));
|
||||
return Some(root);
|
||||
}
|
||||
while let Some(child) = self.queue.front_mut() {
|
||||
let next_elem_this_iter = match child {
|
||||
AstNodeIter::Document(ref mut i) => i.next(),
|
||||
AstNodeIter::Heading(ref mut i) => i.next(),
|
||||
AstNodeIter::Section(ref mut i) => i.next(),
|
||||
AstNodeIter::Paragraph(ref mut i) => i.next(),
|
||||
AstNodeIter::PlainList(ref mut i) => i.next(),
|
||||
AstNodeIter::PlainListItem(ref mut i) => i.next(),
|
||||
AstNodeIter::GreaterBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::DynamicBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::FootnoteDefinition(ref mut i) => i.next(),
|
||||
AstNodeIter::Comment(ref mut i) => i.next(),
|
||||
AstNodeIter::Drawer(ref mut i) => i.next(),
|
||||
AstNodeIter::PropertyDrawer(ref mut i) => i.next(),
|
||||
AstNodeIter::NodeProperty(ref mut i) => i.next(),
|
||||
AstNodeIter::Table(ref mut i) => i.next(),
|
||||
AstNodeIter::TableRow(ref mut i) => i.next(),
|
||||
AstNodeIter::VerseBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::CommentBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::ExampleBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::ExportBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::SrcBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::Clock(ref mut i) => i.next(),
|
||||
AstNodeIter::DiarySexp(ref mut i) => i.next(),
|
||||
AstNodeIter::Planning(ref mut i) => i.next(),
|
||||
AstNodeIter::FixedWidthArea(ref mut i) => i.next(),
|
||||
AstNodeIter::HorizontalRule(ref mut i) => i.next(),
|
||||
AstNodeIter::Keyword(ref mut i) => i.next(),
|
||||
AstNodeIter::BabelCall(ref mut i) => i.next(),
|
||||
AstNodeIter::LatexEnvironment(ref mut i) => i.next(),
|
||||
AstNodeIter::Bold(ref mut i) => i.next(),
|
||||
AstNodeIter::Italic(ref mut i) => i.next(),
|
||||
AstNodeIter::Underline(ref mut i) => i.next(),
|
||||
AstNodeIter::StrikeThrough(ref mut i) => i.next(),
|
||||
AstNodeIter::Code(ref mut i) => i.next(),
|
||||
AstNodeIter::Verbatim(ref mut i) => i.next(),
|
||||
AstNodeIter::PlainText(ref mut i) => i.next(),
|
||||
AstNodeIter::RegularLink(ref mut i) => i.next(),
|
||||
AstNodeIter::RadioLink(ref mut i) => i.next(),
|
||||
AstNodeIter::RadioTarget(ref mut i) => i.next(),
|
||||
AstNodeIter::PlainLink(ref mut i) => i.next(),
|
||||
AstNodeIter::AngleLink(ref mut i) => i.next(),
|
||||
AstNodeIter::OrgMacro(ref mut i) => i.next(),
|
||||
AstNodeIter::Entity(ref mut i) => i.next(),
|
||||
AstNodeIter::LatexFragment(ref mut i) => i.next(),
|
||||
AstNodeIter::ExportSnippet(ref mut i) => i.next(),
|
||||
AstNodeIter::FootnoteReference(ref mut i) => i.next(),
|
||||
AstNodeIter::Citation(ref mut i) => i.next(),
|
||||
AstNodeIter::CitationReference(ref mut i) => i.next(),
|
||||
AstNodeIter::InlineBabelCall(ref mut i) => i.next(),
|
||||
AstNodeIter::InlineSourceBlock(ref mut i) => i.next(),
|
||||
AstNodeIter::LineBreak(ref mut i) => i.next(),
|
||||
AstNodeIter::Target(ref mut i) => i.next(),
|
||||
AstNodeIter::StatisticsCookie(ref mut i) => i.next(),
|
||||
AstNodeIter::Subscript(ref mut i) => i.next(),
|
||||
AstNodeIter::Superscript(ref mut i) => i.next(),
|
||||
AstNodeIter::TableCell(ref mut i) => i.next(),
|
||||
AstNodeIter::Timestamp(ref mut i) => i.next(),
|
||||
};
|
||||
if let Some(next_elem_this_iter) = next_elem_this_iter {
|
||||
self.queue
|
||||
.push_back(AstNodeIter::from_ast_node(&next_elem_this_iter));
|
||||
return Some(next_elem_this_iter);
|
||||
} else {
|
||||
self.queue.pop_front();
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
impl<'r, 's> IntoIterator for AstNode<'r, 's> {
|
||||
type Item = AstNode<'r, 's>;
|
||||
|
||||
type IntoIter = AllAstNodeIter<'r, 's>;
|
||||
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
AllAstNodeIter {
|
||||
root: Some(self),
|
||||
queue: VecDeque::new(),
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user