Trait InfiniteIterator

Source
pub trait InfiniteIterator: Iterator {
    // Required method
    fn next_infinite(&mut self) -> Self::Item;

    // Provided methods
    fn for_each_infinite<F: FnMut(Self::Item)>(self, f: F) -> !
       where Self: Sized { ... }
    fn find_infinite<P>(&mut self, predicate: P) -> Self::Item
       where Self: Sized,
             P: FnMut(&Self::Item) -> bool { ... }
    fn find_map_infinite<B, F>(&mut self, f: F) -> B
       where Self: Sized,
             F: FnMut(Self::Item) -> Option<B> { ... }
    fn position_infinite<P>(&mut self, predicate: P) -> usize
       where Self: Sized,
             P: FnMut(Self::Item) -> bool { ... }
}
Expand description

An Iterator that never ends.

§Invariants

For this trait to be correctly implemented, the following invariants must be upheld:

  1. Some(iter.next_infinite()) must always give the same result as iter.next().
  2. No default-implemented iterator methods may be overriden to have visibly different behaviour than their default implementations.
  3. size_hint().1 must always be None.
  4. The type must not implement ExactSizeIterator.

If any of the above invariants are violated, the behaviour of any code that uses the iterator is unspecified (i.e. it may panic, abort or give wrong results) — however, because InfiniteIterator is not an unsafe trait it still must not invoke Undefined Behaviour.

Required Methods§

Source

fn next_infinite(&mut self) -> Self::Item

Like Iterator::next, but never returning None because the iterator never ends.

Provided Methods§

Source

fn for_each_infinite<F: FnMut(Self::Item)>(self, f: F) -> !
where Self: Sized,

Like Iterator::for_each, but it never returns because the iterator never ends.

§Examples
use infinite_iterator::InfiniteIterator;

fn run() -> ! {
    (0..).for_each_infinite(|num| {
        println!("{num}");
        std::thread::sleep(std::time::Duration::from_secs(5));
    })
}
Source

fn find_infinite<P>(&mut self, predicate: P) -> Self::Item
where Self: Sized, P: FnMut(&Self::Item) -> bool,

Like Iterator::find, but it is guaranteed to find an item (or loop forever) because the iterator is infinite.

§Examples
use infinite_iterator::InfiniteIterator;

assert_eq!((5..).find_infinite(|&num| num > 10), 11);
Source

fn find_map_infinite<B, F>(&mut self, f: F) -> B
where Self: Sized, F: FnMut(Self::Item) -> Option<B>,

Like Iterator::find_map, but it is guaranteed to find an item (or loop forever) because the iterator is infinite.

§Examples
use infinite_iterator::InfiniteIterator;

assert_eq!((5_u32..).step_by(3).find_map_infinite(|num| num.checked_sub(10)), 1);
Source

fn position_infinite<P>(&mut self, predicate: P) -> usize
where Self: Sized, P: FnMut(Self::Item) -> bool,

Like Iterator::position, but it is guaranteed to find an item (or loop forever) because the iterator is infinite.

§Examples
use infinite_iterator::InfiniteIterator;

assert_eq!((5..).position_infinite(|num| num > 10), 6);

Implementations on Foreign Types§

Source§

impl<'item, I, T> InfiniteIterator for Cloned<I>
where T: 'item + Clone, I: InfiniteIterator<Item = &'item T>,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<'item, I, T> InfiniteIterator for Copied<I>
where T: 'item + Copy, I: InfiniteIterator<Item = &'item T>,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<A> InfiniteIterator for RangeFrom<A>
where RangeFrom<A>: Iterator,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<A, B> InfiniteIterator for Chain<A, B>
where A: Iterator, B: InfiniteIterator<Item = A::Item>,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<A, B> InfiniteIterator for Zip<A, B>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<A: Clone> InfiniteIterator for Repeat<A>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<B, I, F> InfiniteIterator for FilterMap<I, F>
where I: InfiniteIterator, F: FnMut(I::Item) -> Option<B>,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<B, I, F> InfiniteIterator for Map<I, F>
where I: InfiniteIterator, F: FnMut(I::Item) -> Option<B>,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<F: FnMut() -> A, A> InfiniteIterator for RepeatWith<F>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I> InfiniteIterator for Flatten<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I, F> InfiniteIterator for Inspect<I, F>
where I: InfiniteIterator, F: FnMut(&I::Item),

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I, P> InfiniteIterator for Filter<I, P>
where I: InfiniteIterator, P: FnMut(&I::Item) -> bool,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I, P> InfiniteIterator for SkipWhile<I, P>
where I: InfiniteIterator, P: FnMut(&I::Item) -> bool,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I, U, F> InfiniteIterator for FlatMap<I, U, F>
where I: InfiniteIterator, U: IntoIterator, F: FnMut(I::Item) -> U,

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: Clone + InfiniteIterator> InfiniteIterator for Cycle<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: InfiniteIterator> InfiniteIterator for Enumerate<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: InfiniteIterator> InfiniteIterator for Fuse<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: InfiniteIterator> InfiniteIterator for Peekable<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: InfiniteIterator> InfiniteIterator for Skip<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: InfiniteIterator> InfiniteIterator for StepBy<I>

Source§

fn next_infinite(&mut self) -> Self::Item

Source§

impl<I: ?Sized + InfiniteIterator> InfiniteIterator for &mut I

Source§

fn next_infinite(&mut self) -> Self::Item

Implementors§