CCCPaste
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)
}