diff options
| author | Ms2ger <ms2ger@gmail.com> | 2015-05-22 15:25:42 +0200 |
|---|---|---|
| committer | Ms2ger <ms2ger@gmail.com> | 2015-05-24 17:30:42 +0200 |
| commit | 8e039a887df4265e9f20b2a29f12d6708965cc63 (patch) | |
| tree | 8d867d8d8f3b98f0acc56e0b43d25597ff639bf5 | |
| parent | ba0e1cd8147d452c356aacb29fb87568ca26f111 (diff) | |
| download | rust-8e039a887df4265e9f20b2a29f12d6708965cc63.tar.gz rust-8e039a887df4265e9f20b2a29f12d6708965cc63.zip | |
Introduce TaggedDocsIterator and use it to implement reader::tagged_docs.
| -rw-r--r-- | src/librbml/lib.rs | 32 |
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 |
