/// An iterator adaptor that flattens `Result::Ok` values and /// allows `Result::Err` values through unchanged. /// /// See [`.flatten_ok()`](crate::Itertools::flatten_ok) for more information. #[must_use = "iterator adaptors are lazy and do nothing unless consumed"] pubstruct FlattenOk<I, T, E> where
I: Iterator<Item = Result<T, E>>,
T: IntoIterator,
{
iter: I,
inner_front: Option<T::IntoIter>,
inner_back: Option<T::IntoIter>,
}
impl<I, T, E> Iterator for FlattenOk<I, T, E> where
I: Iterator<Item = Result<T, E>>,
T: IntoIterator,
{ type Item = Result<T::Item, E>;
// This is necessary for the iterator to implement `FusedIterator` // with only the original iterator being fused. self.inner_back = None;
} else { return None;
}
}
}
}
}
fn size_hint(&self) -> (usize, Option<usize>) { let inner_hint = |inner: &Option<T::IntoIter>| {
inner
.as_ref()
.map(Iterator::size_hint)
.unwrap_or((0, Some(0)))
}; let inner_front = inner_hint(&self.inner_front); let inner_back = inner_hint(&self.inner_back); // The outer iterator `Ok` case could be (0, None) as we don't know its size_hint yet. let outer = matchself.iter.size_hint() {
(0, Some(0)) => (0, Some(0)),
_ => (0, None),
};
// This is necessary for the iterator to implement `FusedIterator` // with only the original iterator being fused. self.inner_front = None;
} else { return None;
}
}
}
}
}
}
/// Only the iterator being flattened needs to implement [`FusedIterator`]. impl<I, T, E> FusedIterator for FlattenOk<I, T, E> where
I: FusedIterator<Item = Result<T, E>>,
T: IntoIterator,
{
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-19)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.