itertools

Function rciter

source
pub fn rciter<I>(iterable: I) -> RcIter<I::IntoIter> 
where I: IntoIterator,
Expand description

Return an iterator inside a Rc<RefCell<_>> wrapper.

The returned RcIter can be cloned, and each clone will refer back to the same original iterator.

RcIter allows doing interesting things like using .zip() on an iterator with itself, at the cost of runtime borrow checking which may have a performance penalty.

Iterator element type is Self::Item.

use itertools::rciter;
use itertools::zip;

// In this example a range iterator is created and we iterate it using
// three separate handles (two of them given to zip).
// We also use the IntoIterator implementation for `&RcIter`.

let mut iter = rciter(0..9);
let mut z = zip(&iter, &iter);

assert_eq!(z.next(), Some((0, 1)));
assert_eq!(z.next(), Some((2, 3)));
assert_eq!(z.next(), Some((4, 5)));
assert_eq!(iter.next(), Some(6));
assert_eq!(z.next(), Some((7, 8)));
assert_eq!(z.next(), None);

Panics in iterator methods if a borrow error is encountered in the iterator methods. It can only happen if the RcIter is reentered in .next(), i.e. if it somehow participates in an “iterator knot” where it is an adaptor of itself.