From: Chris Mikkelson Date: Sun, 7 Apr 2024 20:01:41 +0000 (-0500) Subject: Rename Iter to "entries" to avoid confusion with iterator. X-Git-Url: https://git.mikk.net/?a=commitdiff_plain;h=8e0fd282fbfa3ff823fe0c583c4e38ee5458d720;p=mtbl-rs Rename Iter to "entries" to avoid confusion with iterator. Entries implements IntoIterator. --- diff --git a/src/iter.rs b/src/iter.rs index c95f844..e4155af 100644 --- a/src/iter.rs +++ b/src/iter.rs @@ -3,17 +3,20 @@ use std::cell::RefCell; use std::iter::Iterator; use std::rc::Rc; -pub trait Entries: Iterator + Sized { +pub trait Entries: IntoIterator + Sized { fn seek>(&mut self, key: T); - fn wrap_iter) -> O, O: Iterator>( + fn iter_next(&mut self) -> Option; + + fn wrap_iter>) -> O, O: Iterator>( self, f: F, ) -> impl Entries { - let it = IterCell::new(self); + let b = IterCell::new(self); + let it = f(b.clone().into_iter()); WrapIter { - inner: it.clone(), - outer: f(it), + inner: b, + outer: it, } } @@ -30,29 +33,45 @@ pub trait Entries: Iterator + Sized { } } +// Simple iter wrapper for iter_next +pub struct Iter(T); + +impl Iterator for Iter { + type Item = Entry; + + fn next(&mut self) -> Option { + self.0.iter_next() + } +} + // WrapIter pub struct IterCell { - ic: Rc> + ic: Rc>, } impl Clone for IterCell { fn clone(&self) -> Self { - IterCell{ic: self.ic.clone()} + IterCell { + ic: self.ic.clone(), + } } } impl IterCell { fn new(i: I) -> IterCell { - IterCell{ic: Rc::new(RefCell::new(i))} + IterCell { + ic: Rc::new(RefCell::new(i)), + } } } -impl Iterator for IterCell { +impl IntoIterator for IterCell { type Item = Entry; + type IntoIter = Iter>; - fn next(&mut self) -> Option { - self.ic.borrow_mut().next() + fn into_iter(self) -> Self::IntoIter { + Iter(self) } } @@ -60,19 +79,23 @@ impl Entries for IterCell { fn seek>(&mut self, key: T) { self.ic.borrow_mut().seek(key); } -} + fn iter_next(&mut self) -> Option { + self.ic.borrow_mut().iter_next() + } +} -struct WrapIter> { - inner: IterCell, +struct WrapIter> { + inner: IterCell, outer: O, } -impl> Iterator for WrapIter { +impl> IntoIterator for WrapIter { type Item = Entry; + type IntoIter = Iter>; - fn next(&mut self) -> Option { - self.outer.next() + fn into_iter(self) -> Self::IntoIter { + Iter(self) } } @@ -80,6 +103,10 @@ impl> Entries for WrapIter { fn seek>(&mut self, key: T) { self.inner.seek(key) } + + fn iter_next(&mut self) -> Option { + self.outer.next() + } } // FilterSeek @@ -91,29 +118,22 @@ pub enum FilterSeekResult { } pub use FilterSeekResult::*; -struct FilterSeek, F: FnMut(&Entry, &mut Vec) -> FilterSeekResult> { +struct FilterSeek) -> FilterSeekResult> { inner: I, filter_func: F, seek_key: Vec, } -impl Iterator for FilterSeek +impl IntoIterator for FilterSeek where F: FnMut(&Entry, &mut Vec) -> FilterSeekResult, I: Entries, { type Item = Entry; + type IntoIter = Iter>; - fn next(&mut self) -> Option { - self.seek_key.clear(); - while let Some(e) = self.inner.next() { - match (self.filter_func)(&e, &mut self.seek_key) { - Skip => continue, - Keep => return Some(e), - Seek => self.inner.seek(self.seek_key.as_slice()), - } - } - None + fn into_iter(self) -> Self::IntoIter { + Iter(self) } } @@ -125,6 +145,18 @@ where fn seek>(&mut self, key: T) { self.inner.seek(key.as_ref()); } + + fn iter_next(&mut self) -> Option { + self.seek_key.clear(); + while let Some(e) = self.inner.iter_next() { + match (self.filter_func)(&e, &mut self.seek_key) { + Skip => continue, + Keep => return Some(e), + Seek => self.inner.seek(self.seek_key.as_slice()), + } + } + None + } } #[cfg(test)] @@ -133,10 +165,16 @@ mod test { struct TestIter(u8); - impl Iterator for TestIter { + impl IntoIterator for TestIter { type Item = Entry; + type IntoIter = Iter; + fn into_iter(self) -> Self::IntoIter { + Iter(self) + } + } - fn next(&mut self) -> Option { + impl Entries for TestIter { + fn iter_next(&mut self) -> Option { match self.0 { 255 => None, _ => { @@ -146,9 +184,7 @@ mod test { } } } - } - impl Entries for TestIter { fn seek>(&mut self, kr: T) { self.0 = kr.as_ref()[0]; } @@ -169,6 +205,7 @@ mod test { } FilterSeekResult::Keep }) + .into_iter() .filter(|e| e.key[0] % 5 == 0) .collect(); println!("\n\nTEST: iter_filter"); @@ -181,7 +218,7 @@ mod test { let ti = TestIter(0); let mut mi = ti.wrap_iter(|i| i.filter(|e| e.key[0] % 2 == 0)); mi.seek(&[100]); - let v: Vec = mi.collect(); + let v: Vec = mi.into_iter().collect(); println!("\n\nTEST: iter_wrap"); println!("{:?}", v); }