diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-04-24 19:54:13 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-04-24 19:57:02 -0400 |
| commit | 11d04d452fa8fd8adde10f8de902bfffc59ab704 (patch) | |
| tree | dbc62b8e038f772dc4e513b46054ed4a3f1182dd | |
| parent | 706096b31960143fb1eb957a882f170ae4a8b4e9 (diff) | |
| download | rust-11d04d452fa8fd8adde10f8de902bfffc59ab704.tar.gz rust-11d04d452fa8fd8adde10f8de902bfffc59ab704.zip | |
add a Counter iterator
| -rw-r--r-- | src/libcore/iterator.rs | 45 |
1 files changed, 37 insertions, 8 deletions
diff --git a/src/libcore/iterator.rs b/src/libcore/iterator.rs index 4a3a98df0d0..8bbf8430858 100644 --- a/src/libcore/iterator.rs +++ b/src/libcore/iterator.rs @@ -312,6 +312,19 @@ impl<A, T: Iterator<A>> Iterator<A> for TakeIterator<T> { } } +pub struct ScanIterator<'self, A, B, T, St> { + priv iter: T, + priv f: &'self fn(&mut St, A) -> Option<B>, + state: St +} + +impl<'self, A, B, T: Iterator<A>, St> Iterator<B> for ScanIterator<'self, A, B, T, St> { + #[inline] + fn next(&mut self) -> Option<B> { + self.iter.next().chain(|a| (self.f)(&mut self.state, a)) + } +} + pub struct UnfoldrIterator<'self, A, St> { priv f: &'self fn(&mut St) -> Option<A>, state: St @@ -335,16 +348,25 @@ impl<'self, A, St> Iterator<A> for UnfoldrIterator<'self, A, St> { } } -pub struct ScanIterator<'self, A, B, T, St> { - priv iter: T, - priv f: &'self fn(&mut St, A) -> Option<B>, - state: St +/// An infinite iterator starting at `start` and advancing by `step` with each iteration +pub struct Counter<A> { + state: A, + step: A } -impl<'self, A, B, T: Iterator<A>, St> Iterator<B> for ScanIterator<'self, A, B, T, St> { - #[inline] - fn next(&mut self) -> Option<B> { - self.iter.next().chain(|a| (self.f)(&mut self.state, a)) +pub impl<A> Counter<A> { + #[inline(always)] + fn new(start: A, step: A) -> Counter<A> { + Counter{state: start, step: step} + } +} + +impl<A: Add<A, A> + Clone> Iterator<A> for Counter<A> { + #[inline(always)] + fn next(&mut self) -> Option<A> { + let result = self.state.clone(); + self.state = self.state.add(&self.step); // FIXME: #6050 + Some(result) } } @@ -354,6 +376,13 @@ mod tests { use prelude::*; #[test] + fn test_counter_to_vec() { + let mut it = Counter::new(0, 5).take(10); + let xs = iter::iter_to_vec(|f| it.advance(f)); + assert_eq!(xs, ~[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]); + } + + #[test] fn test_iterator_chain() { let xs = [0u, 1, 2, 3, 4, 5]; let ys = [30, 40, 50, 60]; |
