use crate::element::Element;
use crate::Symbol;
macro_rules! create_new_slice_iterator_type {
($($iterator_name:ident => $item_name:ty),+) => ($(
pub struct $iterator_name<'a> {
values: Option<std::slice::Iter<'a, $item_name>>
}
impl<'a> $iterator_name<'a> {
pub(crate) fn new(data: &'a [$item_name]) -> Self {
$iterator_name {
values: Some(data.iter()),
}
}
}
impl<'a> Iterator for $iterator_name<'a> {
type Item = &'a $item_name;
fn next(&mut self) -> Option<Self::Item> {
self.values.as_mut().and_then(|iter| iter.next())
}
}
)*)
}
create_new_slice_iterator_type!(
SymbolsIterator => Symbol,
SequenceIterator => Element
);
#[derive(Debug, Clone)]
pub struct AnnotationsIntoIter {
into_iter: std::vec::IntoIter<Symbol>,
}
impl AnnotationsIntoIter {
pub(crate) fn new(into_iter: std::vec::IntoIter<Symbol>) -> Self {
Self { into_iter }
}
}
impl Iterator for AnnotationsIntoIter {
type Item = Symbol;
fn next(&mut self) -> Option<Self::Item> {
self.into_iter.next()
}
}