1
1
use std:: iter:: Fuse ;
2
2
use super :: size_hint;
3
3
4
+ pub trait IntersperseElement < Item > {
5
+ fn generate ( & mut self ) -> Item ;
6
+ }
7
+
8
+ #[ derive( Debug , Clone ) ]
9
+ pub struct IntersperseElementSimple < Item > ( Item ) ;
10
+
11
+ impl < Item : Clone > IntersperseElement < Item > for IntersperseElementSimple < Item > {
12
+ fn generate ( & mut self ) -> Item {
13
+ self . 0 . clone ( )
14
+ }
15
+ }
16
+
4
17
/// An iterator adaptor to insert a particular value
5
18
/// between each element of the adapted iterator.
6
19
///
@@ -9,71 +22,18 @@ use super::size_hint;
9
22
/// This iterator is *fused*.
10
23
///
11
24
/// See [`.intersperse()`](../trait.Itertools.html#method.intersperse) for more information.
12
- #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
13
- #[ derive( Clone , Debug ) ]
14
- pub struct Intersperse < I >
15
- where I : Iterator
16
- {
17
- element : I :: Item ,
18
- iter : Fuse < I > ,
19
- peek : Option < I :: Item > ,
20
- }
25
+ pub type Intersperse < I > = IntersperseWith < I , IntersperseElementSimple < <I as Iterator >:: Item > > ;
21
26
22
27
/// Create a new Intersperse iterator
23
28
pub fn intersperse < I > ( iter : I , elt : I :: Item ) -> Intersperse < I >
24
- where I : Iterator
25
- {
26
- let mut iter = iter. fuse ( ) ;
27
- Intersperse {
28
- peek : iter. next ( ) ,
29
- iter,
30
- element : elt,
31
- }
32
- }
33
-
34
- impl < I > Iterator for Intersperse < I >
35
29
where I : Iterator ,
36
- I :: Item : Clone
37
30
{
38
- type Item = I :: Item ;
39
- #[ inline]
40
- fn next ( & mut self ) -> Option < Self :: Item > {
41
- if self . peek . is_some ( ) {
42
- self . peek . take ( )
43
- } else {
44
- self . peek = self . iter . next ( ) ;
45
- if self . peek . is_some ( ) {
46
- Some ( self . element . clone ( ) )
47
- } else {
48
- None
49
- }
50
- }
51
- }
52
-
53
- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
54
- // 2 * SH + { 1 or 0 }
55
- let has_peek = self . peek . is_some ( ) as usize ;
56
- let sh = self . iter . size_hint ( ) ;
57
- size_hint:: add_scalar ( size_hint:: add ( sh, sh) , has_peek)
58
- }
59
-
60
- fn fold < B , F > ( mut self , init : B , mut f : F ) -> B where
61
- Self : Sized , F : FnMut ( B , Self :: Item ) -> B ,
62
- {
63
- let mut accum = init;
64
-
65
- if let Some ( x) = self . peek . take ( ) {
66
- accum = f ( accum, x) ;
67
- }
68
-
69
- let element = & self . element ;
31
+ intersperse_with ( iter, IntersperseElementSimple ( elt) )
32
+ }
70
33
71
- self . iter . fold ( accum,
72
- |accum, x| {
73
- let accum = f ( accum, element. clone ( ) ) ;
74
- let accum = f ( accum, x) ;
75
- accum
76
- } )
34
+ impl < Item , F : FnMut ( ) ->Item > IntersperseElement < Item > for F {
35
+ fn generate ( & mut self ) -> Item {
36
+ self ( )
77
37
}
78
38
}
79
39
@@ -89,7 +49,6 @@ impl<I> Iterator for Intersperse<I>
89
49
#[ derive( Clone , Debug ) ]
90
50
pub struct IntersperseWith < I , ElemF >
91
51
where I : Iterator ,
92
- ElemF : FnMut ( ) -> I :: Item ,
93
52
{
94
53
element : ElemF ,
95
54
iter : Fuse < I > ,
@@ -99,7 +58,6 @@ pub struct IntersperseWith<I, ElemF>
99
58
/// Create a new IntersperseWith iterator
100
59
pub fn intersperse_with < I , ElemF > ( iter : I , elt : ElemF ) -> IntersperseWith < I , ElemF >
101
60
where I : Iterator ,
102
- ElemF : FnMut ( ) -> I :: Item
103
61
{
104
62
let mut iter = iter. fuse ( ) ;
105
63
IntersperseWith {
@@ -111,7 +69,7 @@ pub fn intersperse_with<I, ElemF>(iter: I, elt: ElemF) -> IntersperseWith<I, Ele
111
69
112
70
impl < I , ElemF > Iterator for IntersperseWith < I , ElemF >
113
71
where I : Iterator ,
114
- ElemF : FnMut ( ) -> I :: Item
72
+ ElemF : IntersperseElement < I :: Item >
115
73
{
116
74
type Item = I :: Item ;
117
75
#[ inline]
@@ -121,7 +79,7 @@ impl<I, ElemF> Iterator for IntersperseWith<I, ElemF>
121
79
} else {
122
80
self . peek = self . iter . next ( ) ;
123
81
if self . peek . is_some ( ) {
124
- Some ( ( self . element ) ( ) )
82
+ Some ( self . element . generate ( ) )
125
83
} else {
126
84
None
127
85
}
@@ -148,7 +106,7 @@ impl<I, ElemF> Iterator for IntersperseWith<I, ElemF>
148
106
149
107
self . iter . fold ( accum,
150
108
|accum, x| {
151
- let accum = f ( accum, ( element) ( ) ) ;
109
+ let accum = f ( accum, element. generate ( ) ) ;
152
110
let accum = f ( accum, x) ;
153
111
accum
154
112
} )
0 commit comments