Function itertools::rciter_impl::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.