Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Add an iterate function to core::iter

Implementation by Kevin Ballard.

The function returns an Unfold iterator producing an infinite stream
of results of repeated applications of the function, starting from
the provided seed value.
  • Loading branch information...
commit ed54162e86cd00b7a4ced8957aac7f56897f6fb5 1 parent 88231a9
@jakub- jakub- authored
Showing with 34 additions and 4 deletions.
  1. +25 −4 src/libcore/iter.rs
  2. +9 −0 src/libcoretest/iter.rs
View
29 src/libcore/iter.rs
@@ -64,14 +64,14 @@ the rest of the rust manuals.
*/
+use clone::Clone;
use cmp;
+use cmp::{PartialEq, PartialOrd, Ord};
+use mem;
use num::{Zero, One, CheckedAdd, CheckedSub, Saturating, ToPrimitive, Int};
-use option::{Option, Some, None};
use ops::{Add, Mul, Sub};
-use cmp::{PartialEq, PartialOrd, Ord};
-use clone::Clone;
+use option::{Option, Some, None};
use uint;
-use mem;
/// Conversion from an `Iterator`
pub trait FromIterator<A> {
@@ -2192,6 +2192,27 @@ impl<A: Clone> RandomAccessIterator<A> for Repeat<A> {
fn idx(&mut self, _: uint) -> Option<A> { Some(self.element.clone()) }
}
+type IterateState<'a, T> = (|T|: 'a -> T, Option<T>, bool);
+
+/// An iterator that repeatedly applies a given function, starting
+/// from a given seed value.
+pub type Iterate<'a, T> = Unfold<'a, T, IterateState<'a, T>>;
+
+/// Creates a new iterator that produces an infinite sequence of
+/// repeated applications of the given function `f`.
+#[allow(visible_private_types)]
+pub fn iterate<'a, T: Clone>(f: |T|: 'a -> T, seed: T) -> Iterate<'a, T> {
+ Unfold::new((f, Some(seed), true), |st| {
+ let &(ref mut f, ref mut val, ref mut first) = st;
+ if *first {
+ *first = false;
+ } else {
+ val.mutate(|x| (*f)(x));
+ }
+ val.clone()
+ })
+}
+
/// Functions for lexicographical ordering of sequences.
///
/// Lexicographical ordering through `<`, `<=`, `>=`, `>` requires
View
9 src/libcoretest/iter.rs
@@ -833,3 +833,12 @@ fn test_min_max_result() {
let r = MinMax(1i,2);
assert_eq!(r.into_option(), Some((1,2)));
}
+
+#[test]
+fn test_iterate() {
+ let mut it = iterate(|x| x * 2, 1u);
+ assert_eq!(it.next(), Some(1u));
+ assert_eq!(it.next(), Some(2u));
+ assert_eq!(it.next(), Some(4u));
+ assert_eq!(it.next(), Some(8u));
+}

5 comments on commit ed54162

@bors
Collaborator

saw approval from alexcrichton
at jakub-@ed54162

@bors
Collaborator

merging jakub-/rust/iterate = ed54162 into auto

@bors
Collaborator

jakub-/rust/iterate = ed54162 merged ok, testing candidate = fbeee04

@bors
Collaborator

fast-forwarding master to auto = fbeee04

Please sign in to comment.
Something went wrong with that request. Please try again.