use core::iter::FusedIterator;
use core::marker::PhantomData;
#[derive(Debug, Clone, Copy, Default)]
pub struct InvalidIterator<T = ()>(PhantomData<T>);
pub const INVALID_UNIT_ITERATOR: InvalidIterator<()> = InvalidIterator::DEFAULT;
impl<T> InvalidIterator<T> {
pub const DEFAULT: Self = Self::new();
pub const INVALID_SIZE_HINT: (usize, Option<usize>) = (10, Some(5));
#[must_use]
pub const fn new() -> Self {
Self(PhantomData)
}
}
impl<T> Iterator for InvalidIterator<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
unimplemented!("InvalidIterator is not iteratable");
}
fn size_hint(&self) -> (usize, Option<usize>) {
Self::INVALID_SIZE_HINT
}
}
impl<T> DoubleEndedIterator for InvalidIterator<T> {
fn next_back(&mut self) -> Option<Self::Item> {
unimplemented!("InvalidIterator is not iteratable");
}
}
impl<T> FusedIterator for InvalidIterator<T> {}
impl<T> ExactSizeIterator for InvalidIterator<T> {
fn len(&self) -> usize {
unimplemented!("InvalidIterator does not have a valid len");
}
}