Skip to content

Commit

Permalink
auto merge of #6051 : thestinger/rust/iterator, r=catamorphism,pcwalton
Browse files Browse the repository at this point in the history
  • Loading branch information
bors committed Apr 25, 2013
2 parents 0c6f9a8 + 11d04d4 commit 1d53bab
Showing 1 changed file with 37 additions and 8 deletions.
45 changes: 37 additions & 8 deletions src/libcore/iterator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
}
}

Expand All @@ -353,6 +375,13 @@ mod tests {
use super::*;
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];
Expand Down

0 comments on commit 1d53bab

Please sign in to comment.