diff --git a/src/iterator.rs b/src/iterator.rs
index 0dfa72e..5bfbeab 100644
--- a/src/iterator.rs
+++ b/src/iterator.rs
@@ -10,30 +10,15 @@ impl<'a> Iterator for EbmlSlice<'a> {
     type Item = WebmElement<'a>;
 
     fn next(&mut self) -> Option<WebmElement<'a>> {
-        match WebmElement::check_space(self.0) {
-            Err(err) => {
-                None
-            },
-            Ok(None) => {
-                None
-            },
-            Ok(Some(element_size)) => {
-                let (element_data, rest) = self.0.split_at(element_size);
-                self.0 = rest;
-                match WebmElement::decode_element(element_data) {
-                    Err(err) => {
-                        None
-                    },
-                    Ok(None) => {
-                        // buffer should have enough data
-                        panic!("Buffer was supposed to have enough data to parse element, somehow did not.")
-                    },
-                    Ok(Some((element, _))) => {
-                        Some(element)
-                    }
-                }
+        WebmElement::check_space(self.0).unwrap_or(None).and_then(|element_size| {
+            let (element_data, rest) = self.0.split_at(element_size);
+            self.0 = rest;
+            match WebmElement::decode_element(element_data) {
+                Err(_) => None,
+                Ok(None) => panic!("Buffer was supposed to have enough data to parse element, somehow did not."),
+                Ok(Some((element, _))) => Some(element)
             }
-        }
+        })
     }
 }
 
@@ -41,29 +26,19 @@ impl<'b> EbmlEventSource for EbmlSlice<'b> {
     type Error = EbmlError;
 
     fn poll_event<'a, T: FromEbml<'a>>(&'a mut self) -> Result<Async<Option<T>>, EbmlError> {
-        match T::check_space(self.0) {
-            Err(err) => {
-                Err(err)
-            },
-            Ok(None) => {
-                Ok(None)
-            },
-            Ok(Some(element_size)) => {
-                let (element_data, rest) = self.0.split_at(element_size);
-                self.0 = rest;
-                match T::decode_element(element_data) {
-                    Err(err) => {
-                        Err(err)
-                    },
-                    Ok(None) => {
-                        // buffer should have enough data
-                        panic!("Buffer was supposed to have enough data to parse element, somehow did not.")
-                    },
-                    Ok(Some((element, _))) => {
-                        Ok(Some(element))
+        T::check_space(self.0).and_then(|size_option| {
+            match size_option {
+                None => Ok(None),
+                Some(element_size) => {
+                    let (element_data, rest) = self.0.split_at(element_size);
+                    self.0 = rest;
+                    match T::decode_element(element_data) {
+                        Err(err) => Err(err),
+                        Ok(None) => panic!("Buffer was supposed to have enough data to parse element, somehow did not."),
+                        Ok(Some((element, _))) => Ok(Some(element))
                     }
                 }
             }
-        }.map(Async::Ready)
+        }).map(Async::Ready)
     }
 }