Lifetimes as single tokens from cursor
diff --git a/src/parse.rs b/src/parse.rs
index 3419303..afd0800 100644
--- a/src/parse.rs
+++ b/src/parse.rs
@@ -227,6 +227,18 @@
     }
 }
 
+fn skip(input: ParseStream) -> bool {
+    input.step(|cursor| {
+        if let Some((_lifetime, rest)) = cursor.lifetime() {
+            Ok((true, rest))
+        } else if let Some((_token, rest)) = cursor.token_tree() {
+            Ok((true, rest))
+        } else {
+            Ok((false, *cursor))
+        }
+    }).unwrap()
+}
+
 impl<'a> ParseBuffer<'a> {
     // Not public API.
     #[doc(hidden)]
@@ -266,28 +278,13 @@
     }
 
     pub fn peek2<T: Peek>(&self, token: T) -> bool {
-        if self.is_empty() {
-            return false;
-        }
         let ahead = self.fork();
-        ahead
-            .step(|cursor| Ok(cursor.token_tree().unwrap()))
-            .unwrap();
-        ahead.peek(token)
+        skip(&ahead) && ahead.peek(token)
     }
 
     pub fn peek3<T: Peek>(&self, token: T) -> bool {
-        if self.is_empty() {
-            return false;
-        }
         let ahead = self.fork();
-        ahead
-            .step(|cursor| Ok(cursor.token_tree().unwrap()))
-            .unwrap();
-        ahead
-            .step(|cursor| Ok(cursor.token_tree().unwrap()))
-            .unwrap();
-        ahead.peek(token)
+        skip(&ahead) && skip(&ahead) && ahead.peek(token)
     }
 
     pub fn parse_terminated<T, P: Parse>(