Merge pull request #130 from alexcrichton/from-token-stream-iter

Add `FromIterator<TokenStream> for TokenStream`
diff --git a/src/lib.rs b/src/lib.rs
index e651688..9a033c0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -182,6 +182,11 @@
         TokenStream::_new(streams.into_iter().collect())
     }
 }
+impl FromIterator<TokenStream> for TokenStream {
+    fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
+        TokenStream::_new(streams.into_iter().map(|i| i.inner).collect())
+    }
+}
 
 /// Prints the token stream as a string that is supposed to be losslessly
 /// convertible back into the same token stream (modulo spans), except for
diff --git a/src/stable.rs b/src/stable.rs
index 935e86c..34df695 100644
--- a/src/stable.rs
+++ b/src/stable.rs
@@ -154,6 +154,18 @@
     }
 }
 
+impl iter::FromIterator<TokenStream> for TokenStream {
+    fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
+        let mut v = Vec::new();
+
+        for stream in streams.into_iter() {
+            v.extend(stream.inner);
+        }
+
+        TokenStream { inner: v }
+    }
+}
+
 impl Extend<TokenTree> for TokenStream {
     fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) {
         self.inner.extend(streams);
diff --git a/src/unstable.rs b/src/unstable.rs
index 3e940ca..e8e2e2e 100644
--- a/src/unstable.rs
+++ b/src/unstable.rs
@@ -206,6 +206,45 @@
     }
 }
 
+impl iter::FromIterator<TokenStream> for TokenStream {
+    fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self {
+        let mut streams = streams.into_iter();
+        match streams.next() {
+            #[cfg(slow_extend)]
+            Some(TokenStream::Nightly(first)) => {
+                let stream = iter::once(first).chain(streams.map(|s| {
+                    match s {
+                        TokenStream::Nightly(s) => s,
+                        TokenStream::Stable(_) => mismatch(),
+                    }
+                })).collect();
+                TokenStream::Nightly(stream)
+            }
+            #[cfg(not(slow_extend))]
+            Some(TokenStream::Nightly(mut first)) => {
+                first.extend(streams.map(|s| {
+                    match s {
+                        TokenStream::Nightly(s) => s,
+                        TokenStream::Stable(_) => mismatch(),
+                    }
+                }));
+                TokenStream::Nightly(first)
+            }
+            Some(TokenStream::Stable(mut first)) => {
+                first.extend(streams.map(|s| {
+                    match s {
+                        TokenStream::Stable(s) => s,
+                        TokenStream::Nightly(_) => mismatch(),
+                    }
+                }));
+                TokenStream::Stable(first)
+            }
+            None => TokenStream::new(),
+
+        }
+    }
+}
+
 impl Extend<TokenTree> for TokenStream {
     fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) {
         match self {