@@ -39,6 +39,8 @@ pub trait IteratorUtil<A> {
39
39
fn take_while < ' r > ( self , predicate : & ' r fn ( & A ) -> bool ) -> TakeWhileIterator < ' r , A , Self > ;
40
40
fn skip ( self , n : uint ) -> SkipIterator < Self > ;
41
41
fn take ( self , n : uint ) -> TakeIterator < Self > ;
42
+ fn scan < ' r , St , B > ( self , initial_state : St , f : & ' r fn ( & mut St , A ) -> Option < B > )
43
+ -> ScanIterator < ' r , A , B , Self , St > ;
42
44
fn advance ( & mut self , f : & fn ( A ) -> bool ) ;
43
45
}
44
46
@@ -93,6 +95,12 @@ impl<A, T: Iterator<A>> IteratorUtil<A> for T {
93
95
TakeIterator { iter : self , n : n}
94
96
}
95
97
98
+ #[ inline( always) ]
99
+ fn scan < ' r , St , B > ( self , initial_state : St , f : & ' r fn ( & mut St , A ) -> Option < B > )
100
+ -> ScanIterator < ' r , A , B , T , St > {
101
+ ScanIterator { iter : self , f : f, state : initial_state}
102
+ }
103
+
96
104
/// A shim implementing the `for` loop iteration protocol for iterator objects
97
105
#[ inline]
98
106
fn advance ( & mut self , f : & fn ( A ) -> bool ) {
@@ -306,12 +314,13 @@ impl<A, T: Iterator<A>> Iterator<A> for TakeIterator<T> {
306
314
307
315
pub struct UnfoldrIterator < ' self , A , St > {
308
316
priv f: & ' self fn ( & mut St ) -> Option < A > ,
309
- priv state : St
317
+ state : St
310
318
}
311
319
312
320
pub impl < ' self , A , St > UnfoldrIterator < ' self , A , St > {
313
321
#[ inline]
314
- fn new ( f : & ' self fn ( & mut St ) -> Option < A > , initial_state : St ) -> UnfoldrIterator < ' self , A , St > {
322
+ fn new ( f : & ' self fn ( & mut St ) -> Option < A > , initial_state : St )
323
+ -> UnfoldrIterator < ' self , A , St > {
315
324
UnfoldrIterator {
316
325
f : f,
317
326
state : initial_state
@@ -326,6 +335,19 @@ impl<'self, A, St> Iterator<A> for UnfoldrIterator<'self, A, St> {
326
335
}
327
336
}
328
337
338
+ pub struct ScanIterator < ' self , A , B , T , St > {
339
+ priv iter : T ,
340
+ priv f: & ' self fn ( & mut St , A ) -> Option < B > ,
341
+ state : St
342
+ }
343
+
344
+ impl < ' self , A , B , T : Iterator < A > , St > Iterator < B > for ScanIterator < ' self , A , B , T , St > {
345
+ #[ inline]
346
+ fn next ( & mut self ) -> Option < B > {
347
+ self . iter . next ( ) . chain ( |a| ( self . f ) ( & mut self . state , a) )
348
+ }
349
+ }
350
+
329
351
#[ cfg( test) ]
330
352
mod tests {
331
353
use super :: * ;
@@ -406,6 +428,25 @@ mod tests {
406
428
assert_eq ! ( i, ys. len( ) ) ;
407
429
}
408
430
431
+ #[ test]
432
+ fn test_iterator_scan ( ) {
433
+ // test the type inference
434
+ fn add ( old : & mut int , new : & uint ) -> Option < float > {
435
+ * old += * new as int ;
436
+ Some ( * old as float )
437
+ }
438
+ let xs = [ 0 u, 1 , 2 , 3 , 4 ] ;
439
+ let ys = [ 0 f, 1 f, 3 f, 6 f, 10 f] ;
440
+
441
+ let mut it = xs. iter ( ) . scan ( 0 , add) ;
442
+ let mut i = 0 ;
443
+ for it. advance |x| {
444
+ assert_eq ! ( x, ys[ i] ) ;
445
+ i += 1 ;
446
+ }
447
+ assert_eq ! ( i, ys. len( ) ) ;
448
+ }
449
+
409
450
#[ test]
410
451
fn test_unfoldr ( ) {
411
452
fn count ( st : & mut uint ) -> Option < uint > {
0 commit comments