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};