@@ -18,6 +18,7 @@ implementing the `Iterator` trait.
18
18
*/
19
19
20
20
use prelude:: * ;
21
+ use num:: { Zero , One } ;
21
22
22
23
pub trait Iterator < A > {
23
24
/// Advance the iterator and return the next value. Return `None` when the end is reached.
@@ -205,6 +206,51 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
205
206
fn count ( & mut self ) -> uint { self . fold ( 0 , |cnt, _x| cnt + 1 ) }
206
207
}
207
208
209
+ pub trait AdditiveIterator < A > {
210
+ fn sum ( & mut self ) -> A ;
211
+ }
212
+
213
+ impl < A : Add < A , A > + Zero , T : Iterator < A > > AdditiveIterator < A > for T {
214
+ #[ inline( always) ]
215
+ fn sum ( & mut self ) -> A { self . fold ( Zero :: zero :: < A > ( ) , |s, x| s + x) }
216
+ }
217
+
218
+ pub trait MultiplicativeIterator < A > {
219
+ fn product ( & mut self ) -> A ;
220
+ }
221
+
222
+ impl < A : Mul < A , A > + One , T : Iterator < A > > MultiplicativeIterator < A > for T {
223
+ #[ inline( always) ]
224
+ fn product ( & mut self ) -> A { self . fold ( One :: one :: < A > ( ) , |p, x| p * x) }
225
+ }
226
+
227
+ pub trait OrdIterator < A > {
228
+ fn max ( & mut self ) -> Option < A > ;
229
+ fn min ( & mut self ) -> Option < A > ;
230
+ }
231
+
232
+ impl < A : Ord , T : Iterator < A > > OrdIterator < A > for T {
233
+ #[ inline( always) ]
234
+ fn max ( & mut self ) -> Option < A > {
235
+ self . fold ( None , |max, x| {
236
+ match max {
237
+ None => Some ( x) ,
238
+ Some ( y) => Some ( cmp:: max ( x, y) )
239
+ }
240
+ } )
241
+ }
242
+
243
+ #[ inline( always) ]
244
+ fn min ( & mut self ) -> Option < A > {
245
+ self . fold ( None , |min, x| {
246
+ match min {
247
+ None => Some ( x) ,
248
+ Some ( y) => Some ( cmp:: min ( x, y) )
249
+ }
250
+ } )
251
+ }
252
+ }
253
+
208
254
pub struct ChainIterator < T , U > {
209
255
priv a: T ,
210
256
priv b: U ,
@@ -675,4 +721,37 @@ mod tests {
675
721
assert_eq ! ( v. slice( 0 , 10 ) . iter( ) . count( ) , 10 ) ;
676
722
assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . count( ) , 0 ) ;
677
723
}
724
+
725
+ #[ test]
726
+ fn test_iterator_sum ( ) {
727
+ let v = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
728
+ assert_eq ! ( v. slice( 0 , 4 ) . iter( ) . transform( |& x| x) . sum( ) , 6 ) ;
729
+ assert_eq ! ( v. iter( ) . transform( |& x| x) . sum( ) , 55 ) ;
730
+ assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . transform( |& x| x) . sum( ) , 0 ) ;
731
+ }
732
+
733
+ #[ test]
734
+ fn test_iterator_product ( ) {
735
+ let v = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
736
+ assert_eq ! ( v. slice( 0 , 4 ) . iter( ) . transform( |& x| x) . product( ) , 0 ) ;
737
+ assert_eq ! ( v. slice( 1 , 5 ) . iter( ) . transform( |& x| x) . product( ) , 24 ) ;
738
+ assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . transform( |& x| x) . product( ) , 1 ) ;
739
+ }
740
+
741
+ #[ test]
742
+ fn test_iterator_max ( ) {
743
+ let v = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
744
+ assert_eq ! ( v. slice( 0 , 4 ) . iter( ) . transform( |& x| x) . max( ) , Some ( 3 ) ) ;
745
+ assert_eq ! ( v. iter( ) . transform( |& x| x) . max( ) , Some ( 10 ) ) ;
746
+ assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . transform( |& x| x) . max( ) , None ) ;
747
+ }
748
+
749
+ #[ test]
750
+ fn test_iterator_min ( ) {
751
+ let v = & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ;
752
+ assert_eq ! ( v. slice( 0 , 4 ) . iter( ) . transform( |& x| x) . min( ) , Some ( 0 ) ) ;
753
+ assert_eq ! ( v. iter( ) . transform( |& x| x) . min( ) , Some ( 0 ) ) ;
754
+ assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . transform( |& x| x) . min( ) , None ) ;
755
+ }
756
+
678
757
}
0 commit comments