use sealed::{Bounds, Sealed};
mod sealed {
pub trait Sealed: Sized {}
pub struct Bounds<T>(T);
impl<T> Sealed for Bounds<T> {}
}
pub trait Lifetime<'a, ImplicitBounds: Sealed = Bounds<&'a Self>> {
type Item;
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub trait LendingIterator: for<'a> Lifetime<'a> {
fn next(&mut self) -> Option<<Self as Lifetime<'_>>::Item>;
#[inline]
fn for_each<F>(mut self, mut f: F)
where
Self: Sized,
F: FnMut(<Self as Lifetime>::Item),
{
while let Some(item) = self.next() {
f(item);
}
}
}
pub type Iter<'a, T> = std::iter::Copied<std::slice::Iter<'a, T>>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn iter_as_iterator() {
let numbers = [42, 17, 99];
let mut it: Iter<_> = numbers.iter().copied();
assert_eq!(Iterator::next(&mut it), Some(42));
assert_eq!(Iterator::next(&mut it), Some(17));
assert_eq!(Iterator::next(&mut it), Some(99));
assert_eq!(Iterator::next(&mut it), None);
}
}