use core::iter;
use crate::non_empty::{IntoNonEmptyIterator, NonEmptyIterator};
pub fn chain<I: IntoNonEmptyIterator, J: IntoIterator<Item = I::Item>>(
non_empty: I,
maybe_empty: J,
) -> Chain<I::IntoNonEmptyIter, J::IntoIter> {
Chain::new(non_empty.into_non_empty_iter(), maybe_empty.into_iter())
}
#[derive(Debug, Clone)]
#[must_use = "non-empty iterators are lazy and do nothing unless consumed"]
pub struct Chain<I: NonEmptyIterator, J: Iterator<Item = I::Item>> {
non_empty: I,
maybe_empty: J,
}
impl<I: NonEmptyIterator, J: Iterator<Item = I::Item>> Chain<I, J> {
pub const fn new(non_empty: I, maybe_empty: J) -> Self {
Self {
non_empty,
maybe_empty,
}
}
}
impl<I: NonEmptyIterator, J: Iterator<Item = I::Item>> IntoIterator for Chain<I, J> {
type Item = I::Item;
type IntoIter = iter::Chain<I::IntoIter, J>;
fn into_iter(self) -> Self::IntoIter {
self.non_empty.into_iter().chain(self.maybe_empty)
}
}
unsafe impl<I: NonEmptyIterator, J: Iterator<Item = I::Item>> NonEmptyIterator for Chain<I, J> {}