diff --git a/src/libstd/iterator.rs b/src/libstd/iterator.rs index a6460935a50..2ec8ea41bfb 100644 --- a/src/libstd/iterator.rs +++ b/src/libstd/iterator.rs @@ -32,6 +32,12 @@ pub trait FromIterator> { fn from_iterator(iterator: &mut T) -> Self; } +/// A type growable from an `Iterator` implementation +pub trait Extendable>: FromIterator { + /// Extend a container with the elements yielded by an iterator + fn extend(&mut self, iterator: &mut T); +} + /// An interface for dealing with "external iterators". These types of iterators /// can be resumed at any time as all state is stored internally as opposed to /// being located on the call stack. diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index f08283b17ff..379deff233c 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -2224,7 +2224,7 @@ impl Iterator for VecConsumeRevIterator { } impl> FromIterator for ~[A] { - pub fn from_iterator(iterator: &mut T) -> ~[A] { + fn from_iterator(iterator: &mut T) -> ~[A] { let (lower, _) = iterator.size_hint(); let mut xs = with_capacity(lower); for iterator.advance |x| { @@ -2234,6 +2234,17 @@ impl> FromIterator for ~[A] { } } +impl> Extendable for ~[A] { + fn extend(&mut self, iterator: &mut T) { + let (lower, _) = iterator.size_hint(); + let len = self.len(); + self.reserve(len + lower); + for iterator.advance |x| { + self.push(x); + } + } +} + #[cfg(test)] mod tests { use option::{None, Option, Some};