On Wed, Jun 5, 2013 at 9:09 PM, Daniel Micay <[email protected]> wrote:
>
> All kinds of external iterators implement the following trait, whether
> they are
> a fibonacci number generator, a reverse iterator over a vector or iterator
> over
> a range in a sorted set:
>
> pub trait Iterator<A> {
> /// Advance the iterator and return the next value. Return `None`
> when the end is reached.
> fn next(&mut self) -> Option<A>;
> }
>
Based on my experience with iterators in other languages, I would like
throw in the following idea:
pub trait BlockyIterator<A> {
/// Advance the iterator and return the next block of values.
Return empty vector when the end is reached
fn next(&mut self) -> &'self [A]
}
Rationale: when concrete type of the iterator is known, the next() method
inlines nicely. However, when used polymorphically, every iterator
advancement turns into a function call. A lot of that overhead could be
shaved off, if iterators can return multiple values at a time. A "normal"
Iterator can then be implemented on top of this trait.
This is especially applicable to types which already store elements in an
vector, most notably [T] itself.
> However, without support for compiling a function to a state machine (C#
> does
> this for yield), traversal of a recursive data structure has to be manually
> translated to a procedural algorithm with an explicit stack. For complex
> data
> structures, this process can be very difficult.
>
> I'm hopeful Rust will gain support for this down the road after 1.0. If it
> does, there will be no reason to write immutable internal iterators.
>
This could also be implemented with co-routines. Supposedly stack
switching will be separated from tasks sometime soon?
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev