libcore: use unboxed closures in the fields of Unfold
This commit is contained in:
parent
a50c587242
commit
216bcfd66b
@ -2108,19 +2108,18 @@ impl<A, I, F> RandomAccessIterator<A> for Inspect<A, I, F> where
|
|||||||
/// }
|
/// }
|
||||||
/// ```
|
/// ```
|
||||||
#[experimental]
|
#[experimental]
|
||||||
pub struct Unfold<'a, A, St> {
|
pub struct Unfold<A, St, F> where F: FnMut(&mut St) -> Option<A> {
|
||||||
f: |&mut St|: 'a -> Option<A>,
|
f: F,
|
||||||
/// Internal state that will be passed to the closure on the next iteration
|
/// Internal state that will be passed to the closure on the next iteration
|
||||||
pub state: St,
|
pub state: St,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[experimental]
|
#[experimental]
|
||||||
impl<'a, A, St> Unfold<'a, A, St> {
|
impl<A, St, F> Unfold<A, St, F> where F: FnMut(&mut St) -> Option<A> {
|
||||||
/// Creates a new iterator with the specified closure as the "iterator
|
/// Creates a new iterator with the specified closure as the "iterator
|
||||||
/// function" and an initial state to eventually pass to the closure
|
/// function" and an initial state to eventually pass to the closure
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn new<'a>(initial_state: St, f: |&mut St|: 'a -> Option<A>)
|
pub fn new(initial_state: St, f: F) -> Unfold<A, St, F> {
|
||||||
-> Unfold<'a, A, St> {
|
|
||||||
Unfold {
|
Unfold {
|
||||||
f: f,
|
f: f,
|
||||||
state: initial_state
|
state: initial_state
|
||||||
@ -2129,7 +2128,7 @@ impl<'a, A, St> Unfold<'a, A, St> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[experimental]
|
#[experimental]
|
||||||
impl<'a, A, St> Iterator<A> for Unfold<'a, A, St> {
|
impl<A, St, F> Iterator<A> for Unfold<A, St, F> where F: FnMut(&mut St) -> Option<A> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn next(&mut self) -> Option<A> {
|
fn next(&mut self) -> Option<A> {
|
||||||
(self.f)(&mut self.state)
|
(self.f)(&mut self.state)
|
||||||
@ -2456,18 +2455,24 @@ impl<A: Clone> RandomAccessIterator<A> for Repeat<A> {
|
|||||||
fn idx(&mut self, _: uint) -> Option<A> { Some(self.element.clone()) }
|
fn idx(&mut self, _: uint) -> Option<A> { Some(self.element.clone()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
type IterateState<'a, T> = (|T|: 'a -> T, Option<T>, bool);
|
type IterateState<T, F> = (F, Option<T>, bool);
|
||||||
|
|
||||||
/// An iterator that repeatedly applies a given function, starting
|
/// An iterator that repeatedly applies a given function, starting
|
||||||
/// from a given seed value.
|
/// from a given seed value.
|
||||||
#[experimental]
|
#[experimental]
|
||||||
pub type Iterate<'a, T> = Unfold<'a, T, IterateState<'a, T>>;
|
pub type Iterate<T, F> = Unfold<T, IterateState<T, F>, fn(&mut IterateState<T, F>) -> Option<T>>;
|
||||||
|
|
||||||
/// Create a new iterator that produces an infinite sequence of
|
/// Create a new iterator that produces an infinite sequence of
|
||||||
/// repeated applications of the given function `f`.
|
/// repeated applications of the given function `f`.
|
||||||
#[experimental]
|
#[experimental]
|
||||||
pub fn iterate<'a, T: Clone>(seed: T, f: |T|: 'a -> T) -> Iterate<'a, T> {
|
pub fn iterate<T, F>(seed: T, f: F) -> Iterate<T, F> where
|
||||||
Unfold::new((f, Some(seed), true), |st| {
|
T: Clone,
|
||||||
|
F: FnMut(T) -> T,
|
||||||
|
{
|
||||||
|
fn next<T, F>(st: &mut IterateState<T, F>) -> Option<T> where
|
||||||
|
T: Clone,
|
||||||
|
F: FnMut(T) -> T,
|
||||||
|
{
|
||||||
let &(ref mut f, ref mut val, ref mut first) = st;
|
let &(ref mut f, ref mut val, ref mut first) = st;
|
||||||
if *first {
|
if *first {
|
||||||
*first = false;
|
*first = false;
|
||||||
@ -2480,7 +2485,9 @@ pub fn iterate<'a, T: Clone>(seed: T, f: |T|: 'a -> T) -> Iterate<'a, T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val.clone()
|
val.clone()
|
||||||
})
|
}
|
||||||
|
|
||||||
|
Unfold::new((f, Some(seed), true), next)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new iterator that endlessly repeats the element `elt`.
|
/// Create a new iterator that endlessly repeats the element `elt`.
|
||||||
|
Loading…
Reference in New Issue
Block a user