2
2
3
3
use std:: iter:: Fuse ;
4
4
5
+ // `HomogeneousTuple` is a public facade for `TupleCollect`, allowing
6
+ // tuple-related methods to be used by clients in generic contexts, while
7
+ // hiding the implementation details of `TupleCollect`.
8
+ // See https://github.com/rust-itertools/itertools/issues/387
9
+
10
+ /// Implemented for homogeneous tuples of size up to 4.
11
+ pub trait HomogeneousTuple
12
+ : TupleCollect
13
+ { }
14
+
15
+ impl < T : TupleCollect > HomogeneousTuple for T { }
16
+
5
17
/// An iterator over a incomplete tuple.
6
18
///
7
19
/// See [`.tuples()`](../trait.Itertools.html#method.tuples) and
8
20
/// [`Tuples::into_buffer()`](struct.Tuples.html#method.into_buffer).
9
21
#[ derive( Clone , Debug ) ]
10
22
pub struct TupleBuffer < T >
11
- where T : TupleCollect
23
+ where T : HomogeneousTuple
12
24
{
13
25
cur : usize ,
14
26
buf : T :: Buffer ,
15
27
}
16
28
17
29
impl < T > TupleBuffer < T >
18
- where T : TupleCollect
30
+ where T : HomogeneousTuple
19
31
{
20
32
fn new ( buf : T :: Buffer ) -> Self {
21
33
TupleBuffer {
@@ -26,7 +38,7 @@ impl<T> TupleBuffer<T>
26
38
}
27
39
28
40
impl < T > Iterator for TupleBuffer < T >
29
- where T : TupleCollect
41
+ where T : HomogeneousTuple
30
42
{
31
43
type Item = T :: Item ;
32
44
@@ -54,7 +66,7 @@ impl<T> Iterator for TupleBuffer<T>
54
66
}
55
67
56
68
impl < T > ExactSizeIterator for TupleBuffer < T >
57
- where T : TupleCollect
69
+ where T : HomogeneousTuple
58
70
{
59
71
}
60
72
@@ -65,7 +77,7 @@ impl<T> ExactSizeIterator for TupleBuffer<T>
65
77
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
66
78
pub struct Tuples < I , T >
67
79
where I : Iterator < Item = T :: Item > ,
68
- T : TupleCollect
80
+ T : HomogeneousTuple
69
81
{
70
82
iter : Fuse < I > ,
71
83
buf : T :: Buffer ,
@@ -74,7 +86,7 @@ pub struct Tuples<I, T>
74
86
/// Create a new tuples iterator.
75
87
pub fn tuples < I , T > ( iter : I ) -> Tuples < I , T >
76
88
where I : Iterator < Item = T :: Item > ,
77
- T : TupleCollect
89
+ T : HomogeneousTuple
78
90
{
79
91
Tuples {
80
92
iter : iter. fuse ( ) ,
@@ -84,7 +96,7 @@ pub fn tuples<I, T>(iter: I) -> Tuples<I, T>
84
96
85
97
impl < I , T > Iterator for Tuples < I , T >
86
98
where I : Iterator < Item = T :: Item > ,
87
- T : TupleCollect
99
+ T : HomogeneousTuple
88
100
{
89
101
type Item = T ;
90
102
@@ -95,7 +107,7 @@ impl<I, T> Iterator for Tuples<I, T>
95
107
96
108
impl < I , T > Tuples < I , T >
97
109
where I : Iterator < Item = T :: Item > ,
98
- T : TupleCollect
110
+ T : HomogeneousTuple
99
111
{
100
112
/// Return a buffer with the produced items that was not enough to be grouped in a tuple.
101
113
///
@@ -121,7 +133,7 @@ impl<I, T> Tuples<I, T>
121
133
#[ derive( Clone , Debug ) ]
122
134
pub struct TupleWindows < I , T >
123
135
where I : Iterator < Item = T :: Item > ,
124
- T : TupleCollect
136
+ T : HomogeneousTuple
125
137
{
126
138
iter : I ,
127
139
last : Option < T > ,
@@ -130,7 +142,7 @@ pub struct TupleWindows<I, T>
130
142
/// Create a new tuple windows iterator.
131
143
pub fn tuple_windows < I , T > ( mut iter : I ) -> TupleWindows < I , T >
132
144
where I : Iterator < Item = T :: Item > ,
133
- T : TupleCollect ,
145
+ T : HomogeneousTuple ,
134
146
T :: Item : Clone
135
147
{
136
148
use std:: iter:: once;
@@ -153,7 +165,7 @@ pub fn tuple_windows<I, T>(mut iter: I) -> TupleWindows<I, T>
153
165
154
166
impl < I , T > Iterator for TupleWindows < I , T >
155
167
where I : Iterator < Item = T :: Item > ,
156
- T : TupleCollect + Clone ,
168
+ T : HomogeneousTuple + Clone ,
157
169
T :: Item : Clone
158
170
{
159
171
type Item = T ;
0 commit comments