use super::variant::*;
use std::{mem::*, slice, vec};
pub enum VariantIterator<'own, AnnotatedT> {
Iterator(slice::Iter<'own, Variant<AnnotatedT>>),
Variant(Option<&'own Variant<AnnotatedT>>),
}
impl<'own, AnnotatedT> VariantIterator<'own, AnnotatedT> {
pub fn new(variant: &'own Variant<AnnotatedT>) -> Self {
match variant {
Variant::List(list) => Self::Iterator(list.inner.iter()),
_ => Self::Variant(Some(variant)),
}
}
}
impl<'own, AnnotatedT> Iterator for VariantIterator<'own, AnnotatedT> {
type Item = &'own Variant<AnnotatedT>;
fn next(&mut self) -> Option<Self::Item> {
match self {
Self::Iterator(iter) => iter.next(),
Self::Variant(variant) => take(variant),
}
}
}
pub enum IntoVariantIterator<AnnotatedT> {
Iterator(vec::IntoIter<Variant<AnnotatedT>>),
Variant(Option<Variant<AnnotatedT>>),
}
impl<AnnotatedT> IntoVariantIterator<AnnotatedT> {
pub fn new(variant: Variant<AnnotatedT>) -> Self {
match variant {
Variant::List(list) => Self::Iterator(list.inner.into_iter()),
_ => Self::Variant(Some(variant)),
}
}
}
impl<AnnotatedT> Iterator for IntoVariantIterator<AnnotatedT> {
type Item = Variant<AnnotatedT>;
fn next(&mut self) -> Option<Self::Item> {
match self {
Self::Iterator(iter) => iter.next(),
Self::Variant(variant) => take(variant),
}
}
}