use super::{super::normal::*, iterator::*};
use kutil::std::collections::*;
pub struct KeyValuePairIteratorForVariantIterator<'own, InnerT, AnnotatedT> {
pub inner: InnerT,
pub keys: FastHashSet<&'own Variant<AnnotatedT>>,
}
impl<'own, InnerT, AnnotatedT> KeyValuePairIteratorForVariantIterator<'own, InnerT, AnnotatedT> {
pub fn new(inner: InnerT) -> Self {
Self { inner, keys: FastHashSet::default() }
}
pub fn new_for<IterableT>(iterable: IterableT) -> Self
where
IterableT: IntoIterator<IntoIter = InnerT>,
{
Self::new(iterable.into_iter())
}
}
impl<'own, InnerT, AnnotatedT> KeyValuePairIterator<AnnotatedT>
for KeyValuePairIteratorForVariantIterator<'own, InnerT, AnnotatedT>
where
InnerT: Iterator<Item = &'own Variant<AnnotatedT>>,
AnnotatedT: Default,
{
fn next(
&mut self,
) -> Result<
Option<(&'own Variant<AnnotatedT>, &'own Variant<AnnotatedT>)>,
(MalformedError<AnnotatedT>, &Variant<AnnotatedT>),
> {
if let Some(item) = self.inner.next() {
if let Some((key, value)) = item.to_pair() {
if self.keys.contains(key) {
return Err((MalformedError::new("key-value pair".into(), "key is not unique".into()), key));
} else {
self.keys.insert(key);
return Ok(Some((key, value)));
}
}
return Err((MalformedError::new("key-value pair".into(), "is not list of length 2".into()), item));
}
Ok(None)
}
}
pub struct IntoKeyValuePairIteratorForVariantIterator<InnerT, AnnotatedT> {
pub inner: InnerT,
pub keys: FastHashSet<Variant<AnnotatedT>>,
}
impl<InnerT, AnnotatedT> IntoKeyValuePairIteratorForVariantIterator<InnerT, AnnotatedT> {
pub fn new(inner: InnerT) -> Self {
Self { inner, keys: FastHashSet::default() }
}
pub fn new_for<IterableT>(iterable: IterableT) -> Self
where
IterableT: IntoIterator<IntoIter = InnerT>,
{
Self::new(iterable.into_iter())
}
}
impl<InnerT, AnnotatedT> IntoKeyValuePairIterator<AnnotatedT>
for IntoKeyValuePairIteratorForVariantIterator<InnerT, AnnotatedT>
where
InnerT: Iterator<Item = Variant<AnnotatedT>>,
AnnotatedT: Clone + Default,
{
fn next(
&mut self,
) -> Result<Option<(Variant<AnnotatedT>, Variant<AnnotatedT>)>, (MalformedError<AnnotatedT>, Variant<AnnotatedT>)>
{
if let Some(item) = self.inner.next() {
if let Variant::List(list) = &item
&& list.inner.len() == 2
{
let (key, value) = item.into_pair().expect("list of length 2");
if self.keys.contains(&key) {
return Err((MalformedError::new("key-value pair".into(), "key is not unique".into()), key));
} else {
self.keys.insert(key.clone());
return Ok(Some((key, value)));
}
}
return Err((MalformedError::new("key-value pair".into(), "is not list of length 2".into()), item));
}
Ok(None)
}
}