@@ -18,6 +18,7 @@ implementing the `Iterator` trait.
1818*/
1919
2020use prelude:: * ;
21+ use num:: { Zero , One } ;
2122
2223pub trait Iterator < A > {
2324 /// 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 {
205206 fn count ( & mut self ) -> uint { self . fold ( 0 , |cnt, _x| cnt + 1 ) }
206207}
207208
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+
208254pub struct ChainIterator < T , U > {
209255 priv a: T ,
210256 priv b: U ,
@@ -675,4 +721,37 @@ mod tests {
675721 assert_eq ! ( v. slice( 0 , 10 ) . iter( ) . count( ) , 10 ) ;
676722 assert_eq ! ( v. slice( 0 , 0 ) . iter( ) . count( ) , 0 ) ;
677723 }
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+
678757}
0 commit comments