Optimize token module for compile time
diff --git a/src/token.rs b/src/token.rs
index d897508..a95bdc2 100644
--- a/src/token.rs
+++ b/src/token.rs
@@ -215,7 +215,9 @@
 
             impl std::default::Default for $name {
                 fn default() -> Self {
-                    $name(Span::call_site())
+                    $name {
+                        span: Span::call_site(),
+                    }
                 }
             }
 
@@ -251,7 +253,9 @@
             #[cfg(feature = "parsing")]
             impl Parse for $name {
                 fn parse(input: ParseStream) -> Result<Self> {
-                    parsing::keyword(input, $token).map($name)
+                    Ok($name {
+                        span: parsing::keyword(input, $token)?,
+                    })
                 }
             }
         )*
@@ -284,7 +288,9 @@
 
             impl std::default::Default for $name {
                 fn default() -> Self {
-                    $name([Span::call_site(); $len])
+                    $name {
+                        spans: [Span::call_site(); $len],
+                    }
                 }
             }
 
@@ -330,7 +336,9 @@
             #[cfg(feature = "parsing")]
             impl Parse for $name {
                 fn parse(input: ParseStream) -> Result<Self> {
-                    parsing::punct(input, $token).map($name::<[Span; $len]>)
+                    Ok($name {
+                        spans: parsing::punct(input, $token)?,
+                    })
                 }
             }
         )*
@@ -356,7 +364,9 @@
 
             impl std::default::Default for $name {
                 fn default() -> Self {
-                    $name(Span::call_site())
+                    $name {
+                        span: Span::call_site(),
+                    }
                 }
             }
 
@@ -710,9 +720,14 @@
     }
 
     pub fn punct<S: FromSpans>(input: ParseStream, token: &str) -> Result<S> {
+        let mut spans = [input.cursor().span(); 3];
+        punct_helper(input, token, &mut spans)?;
+        Ok(S::from_spans(&spans))
+    }
+
+    fn punct_helper(input: ParseStream, token: &str, spans: &mut [Span; 3]) -> Result<()> {
         input.step(|cursor| {
             let mut cursor = *cursor;
-            let mut spans = [cursor.span(); 3];
             assert!(token.len() <= spans.len());
 
             for (i, ch) in token.chars().enumerate() {
@@ -722,7 +737,7 @@
                         if punct.as_char() != ch {
                             break;
                         } else if i == token.len() - 1 {
-                            return Ok((S::from_spans(&spans), rest));
+                            return Ok(((), rest));
                         } else if punct.spacing() != Spacing::Joint {
                             break;
                         }