3 use std
::cell
::RefCell
;
4 use alloc
::collections
::VecDeque
;
7 /// Common buffer object for the two tee halves
9 struct TeeBuffer
<A
, I
> {
12 /// The owner field indicates which id should read from the backlog
16 /// One half of an iterator pair where both return the same elements.
18 /// See [`.tee()`](crate::Itertools::tee) for more information.
19 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
24 rcbuffer
: Rc
<RefCell
<TeeBuffer
<I
::Item
, I
>>>,
28 pub fn new
<I
>(iter
: I
) -> (Tee
<I
>, Tee
<I
>)
31 let buffer
= TeeBuffer{backlog: VecDeque::new(), iter, owner: false}
;
32 let t1
= Tee{rcbuffer: Rc::new(RefCell::new(buffer)), id: true}
;
33 let t2
= Tee{rcbuffer: t1.rcbuffer.clone(), id: false}
;
37 impl<I
> Iterator
for Tee
<I
>
42 fn next(&mut self) -> Option
<Self::Item
> {
43 // .borrow_mut may fail here -- but only if the user has tied some kind of weird
44 // knot where the iterator refers back to itself.
45 let mut buffer
= self.rcbuffer
.borrow_mut();
46 if buffer
.owner
== self.id
{
47 match buffer
.backlog
.pop_front() {
49 some_elt
=> return some_elt
,
52 match buffer
.iter
.next() {
55 buffer
.backlog
.push_back(elt
.clone());
56 buffer
.owner
= !self.id
;
62 fn size_hint(&self) -> (usize, Option
<usize>) {
63 let buffer
= self.rcbuffer
.borrow();
64 let sh
= buffer
.iter
.size_hint();
66 if buffer
.owner
== self.id
{
67 let log_len
= buffer
.backlog
.len();
68 size_hint
::add_scalar(sh
, log_len
)
75 impl<I
> ExactSizeIterator
for Tee
<I
>
76 where I
: ExactSizeIterator
,