about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMs2ger <ms2ger@gmail.com>2015-05-22 15:25:42 +0200
committerMs2ger <ms2ger@gmail.com>2015-05-24 17:30:42 +0200
commit8e039a887df4265e9f20b2a29f12d6708965cc63 (patch)
tree8d867d8d8f3b98f0acc56e0b43d25597ff639bf5
parentba0e1cd8147d452c356aacb29fb87568ca26f111 (diff)
downloadrust-8e039a887df4265e9f20b2a29f12d6708965cc63.tar.gz
rust-8e039a887df4265e9f20b2a29f12d6708965cc63.zip
Introduce TaggedDocsIterator and use it to implement reader::tagged_docs.
-rw-r--r--src/librbml/lib.rs32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/librbml/lib.rs b/src/librbml/lib.rs
index 65433c528bc..0ee322b06c1 100644
--- a/src/librbml/lib.rs
+++ b/src/librbml/lib.rs
@@ -436,23 +436,31 @@ pub mod reader {
         }
     }
 
-    pub fn tagged_docs<F>(d: Doc, tg: usize, mut it: F) -> bool where
+    pub fn tagged_docs<F>(d: Doc, tg: usize, it: F) -> bool where
         F: FnMut(Doc) -> bool,
     {
-        let mut pos = d.start;
-        while pos < d.end {
-            let elt_tag = try_or!(tag_at(d.data, pos), false);
-            let elt_size = try_or!(tag_len_at(d.data, elt_tag), false);
-            pos = elt_size.next + elt_size.val;
-            if elt_tag.val == tg {
-                let doc = Doc { data: d.data, start: elt_size.next,
-                                end: pos };
-                if !it(doc) {
-                    return false;
+        TaggedDocsIterator {
+            iter: docs(d),
+            tag: tg,
+        }.all(it)
+    }
+
+    pub struct TaggedDocsIterator<'a> {
+        iter: DocsIterator<'a>,
+        tag: usize,
+    }
+
+    impl<'a> Iterator for TaggedDocsIterator<'a> {
+        type Item = Doc<'a>;
+
+        fn next(&mut self) -> Option<Doc<'a>> {
+            while let Some((tag, doc)) = self.iter.next() {
+                if tag == self.tag {
+                    return Some(doc);
                 }
             }
+            None
         }
-        return true;
     }
 
     pub fn with_doc_data<T, F>(d: Doc, f: F) -> T where