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( 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
@@ -64,7 +76,7 @@ impl<T> ExactSizeIterator for TupleBuffer<T>
64
76
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
65
77
pub struct Tuples < I , T >
66
78
where I : Iterator < Item = T :: Item > ,
67
- T : TupleCollect
79
+ T : HomogeneousTuple
68
80
{
69
81
iter : Fuse < I > ,
70
82
buf : T :: Buffer ,
@@ -73,7 +85,7 @@ pub struct Tuples<I, T>
73
85
/// Create a new tuples iterator.
74
86
pub fn tuples < I , T > ( iter : I ) -> Tuples < I , T >
75
87
where I : Iterator < Item = T :: Item > ,
76
- T : TupleCollect
88
+ T : HomogeneousTuple
77
89
{
78
90
Tuples {
79
91
iter : iter. fuse ( ) ,
@@ -83,7 +95,7 @@ pub fn tuples<I, T>(iter: I) -> Tuples<I, T>
83
95
84
96
impl < I , T > Iterator for Tuples < I , T >
85
97
where I : Iterator < Item = T :: Item > ,
86
- T : TupleCollect
98
+ T : HomogeneousTuple
87
99
{
88
100
type Item = T ;
89
101
@@ -94,7 +106,7 @@ impl<I, T> Iterator for Tuples<I, T>
94
106
95
107
impl < I , T > Tuples < I , T >
96
108
where I : Iterator < Item = T :: Item > ,
97
- T : TupleCollect
109
+ T : HomogeneousTuple
98
110
{
99
111
/// Return a buffer with the produced items that was not enough to be grouped in a tuple.
100
112
///
@@ -120,7 +132,7 @@ impl<I, T> Tuples<I, T>
120
132
#[ derive( Debug ) ]
121
133
pub struct TupleWindows < I , T >
122
134
where I : Iterator < Item = T :: Item > ,
123
- T : TupleCollect
135
+ T : HomogeneousTuple
124
136
{
125
137
iter : I ,
126
138
last : Option < T > ,
@@ -129,7 +141,7 @@ pub struct TupleWindows<I, T>
129
141
/// Create a new tuple windows iterator.
130
142
pub fn tuple_windows < I , T > ( mut iter : I ) -> TupleWindows < I , T >
131
143
where I : Iterator < Item = T :: Item > ,
132
- T : TupleCollect ,
144
+ T : HomogeneousTuple ,
133
145
T :: Item : Clone
134
146
{
135
147
use std:: iter:: once;
@@ -152,7 +164,7 @@ pub fn tuple_windows<I, T>(mut iter: I) -> TupleWindows<I, T>
152
164
153
165
impl < I , T > Iterator for TupleWindows < I , T >
154
166
where I : Iterator < Item = T :: Item > ,
155
- T : TupleCollect + Clone ,
167
+ T : HomogeneousTuple + Clone ,
156
168
T :: Item : Clone
157
169
{
158
170
type Item = T ;
0 commit comments