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 {