@@ -54,18 +54,17 @@ where
54
54
{
55
55
element : ElemF ,
56
56
iter : Fuse < I > ,
57
- peek : Option < I :: Item > ,
57
+ peek : Option < Option < I :: Item > > ,
58
58
}
59
59
60
60
/// Create a new `IntersperseWith` iterator
61
61
pub fn intersperse_with < I , ElemF > ( iter : I , elt : ElemF ) -> IntersperseWith < I , ElemF >
62
62
where
63
63
I : Iterator ,
64
64
{
65
- let mut iter = iter. fuse ( ) ;
66
65
IntersperseWith {
67
- peek : iter . next ( ) ,
68
- iter,
66
+ peek : None ,
67
+ iter : iter . fuse ( ) ,
69
68
element : elt,
70
69
}
71
70
}
@@ -83,11 +82,11 @@ where
83
82
iter,
84
83
peek,
85
84
} = self ;
86
- match peek. take ( ) {
85
+ match peek. get_or_insert_with ( || iter . next ( ) ) . take ( ) {
87
86
item @ Some ( _) => item,
88
87
None => match iter. next ( ) {
89
88
new @ Some ( _) => {
90
- * peek = new;
89
+ * peek = Some ( new) ;
91
90
Some ( element. generate ( ) )
92
91
}
93
92
None => None ,
@@ -96,26 +95,32 @@ where
96
95
}
97
96
98
97
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
99
- // 2 * SH + { 1 or 0 }
100
- let has_peek = self . peek . is_some ( ) as usize ;
101
- let sh = self . iter . size_hint ( ) ;
102
- size_hint:: add_scalar ( size_hint:: add ( sh, sh) , has_peek)
98
+ let mut sh = self . iter . size_hint ( ) ;
99
+ sh = size_hint:: add ( sh, sh) ;
100
+ match self . peek {
101
+ Some ( Some ( _) ) => size_hint:: add_scalar ( sh, 1 ) ,
102
+ Some ( None ) => sh,
103
+ None => size_hint:: sub_scalar ( sh, 1 ) ,
104
+ }
103
105
}
104
106
105
- fn fold < B , F > ( mut self , init : B , mut f : F ) -> B
107
+ fn fold < B , F > ( self , init : B , mut f : F ) -> B
106
108
where
107
109
Self : Sized ,
108
110
F : FnMut ( B , Self :: Item ) -> B ,
109
111
{
112
+ let Self {
113
+ mut element,
114
+ mut iter,
115
+ peek,
116
+ } = self ;
110
117
let mut accum = init;
111
118
112
- if let Some ( x) = self . peek . take ( ) {
119
+ if let Some ( x) = peek. unwrap_or_else ( || iter . next ( ) ) {
113
120
accum = f ( accum, x) ;
114
121
}
115
122
116
- let element = & mut self . element ;
117
-
118
- self . iter . fold ( accum, |accum, x| {
123
+ iter. fold ( accum, |accum, x| {
119
124
let accum = f ( accum, element. generate ( ) ) ;
120
125
f ( accum, x)
121
126
} )
0 commit comments