struct Tee where T: Iterator, T::Item: Clone, { v: VecDeque, iter: T, i1: usize, i2: usize, none_encountered: bool, } pub fn tee(into_iter: T) -> (impl Iterator, impl Iterator) where T: IntoIterator, T::Item: Clone, { let t = Rc::new(RefCell::new(Tee { v: VecDeque::new(), iter: into_iter.into_iter(), i1: 0, i2: 0, none_encountered: false, })); let first; let second; { let t1 = Rc::clone(&t); first = from_fn(move || { let mut s = t1.borrow_mut(); if s.i2 != 0 { s.i2 -= 1; return Some(s.v.pop_front().unwrap()); } if s.none_encountered { return None; } match s.iter.next() { None => { s.none_encountered = true; None } Some(a) => { s.v.push_back(a.clone()); s.i1 += 1; Some(a) } } }); } { let t2 = Rc::clone(&t); second = from_fn(move || { let mut s = t2.borrow_mut(); if s.i1 != 0 { s.i1 -= 1; return Some(s.v.pop_front().unwrap()); } if s.none_encountered { return None; } match s.iter.next() { None => { s.none_encountered = true; None } Some(a) => { s.v.push_back(a.clone()); s.i2 += 1; Some(a) } } }); } (first, second) }