From 3ae0b13e5342ddc589ff576b64d6618a712a9b2b Mon Sep 17 00:00:00 2001 From: Chris Mikkelson Date: Tue, 8 Apr 2025 13:13:17 -0500 Subject: [PATCH] Refactor again to take advantage of impl Trait. Will pursue mixed mergers through methods other than direct dyn Compatibility of Source trait. --- src/dupsort.rs | 20 ++++++-------------- src/filter.rs | 11 +++++------ src/merge.rs | 7 +++---- src/merger.rs | 7 +++---- src/reader/mod.rs | 7 ++----- src/source.rs | 40 +++++++++++++++++----------------------- 6 files changed, 36 insertions(+), 56 deletions(-) diff --git a/src/dupsort.rs b/src/dupsort.rs index 04b449f..3c05b60 100644 --- a/src/dupsort.rs +++ b/src/dupsort.rs @@ -7,10 +7,7 @@ where { source: S, #[allow(clippy::type_complexity)] - // Attempting to factor out the `::Item` type removes the ability to use the - // implicit '_ lifetime. - dupsort_func: - Box as Iterator>::Item, & as Iterator>::Item) -> Ordering>, + dupsort_func: Box Ordering>, } impl DupsortSource @@ -19,8 +16,7 @@ where { pub fn new(source: S, dupsort_func: F) -> Self where - F: Fn(& as Iterator>::Item, & as Iterator>::Item) -> Ordering - + 'static, + F: Fn(&S::Item, &S::Item) -> Ordering + 'static, { Self { source, @@ -31,15 +27,11 @@ where impl Source for DupsortSource where - S: Source + 'static, - for<'i> as Iterator>::Item: PartialEq, + S: Source, + S::Item: PartialEq, { - type Iter<'i> = DupsortIter< - S::Iter<'i>, - &'i dyn Fn(& as Iterator>::Item, & as Iterator>::Item) -> Ordering, - >; - - fn iter(&self) -> Self::Iter<'_> { + type Item = S::Item; + fn iter(&self) -> impl SeekableIter { self.source.iter().dupsort_func(&self.dupsort_func) } } diff --git a/src/filter.rs b/src/filter.rs index b420c21..9d224f6 100644 --- a/src/filter.rs +++ b/src/filter.rs @@ -58,7 +58,7 @@ where { source: S, #[allow(clippy::type_complexity)] - filter_func: Box as Iterator>::Item, &mut Vec) -> bool>, + filter_func: Box) -> bool>, } impl FilterSource @@ -67,7 +67,7 @@ where { pub fn new(source: S, filter_func: F) -> Self where - F: Fn(& as Iterator>::Item, &mut Vec) -> bool + 'static, + F: Fn(&S::Item, &mut Vec) -> bool + 'static, { Self { source, @@ -78,11 +78,10 @@ where impl Source for FilterSource where - S: Source + 'static, + S: Source, { - type Iter<'i> = - FilterIter, &'i dyn Fn(& as Iterator>::Item, &mut Vec) -> bool>; - fn iter(&self) -> Self::Iter<'_> { + type Item = S::Item; + fn iter(&self) -> impl SeekableIter { self.source.iter().filter_func(&self.filter_func) } } diff --git a/src/merge.rs b/src/merge.rs index e6f79dd..ae26304 100644 --- a/src/merge.rs +++ b/src/merge.rs @@ -22,11 +22,10 @@ where } impl Source for MergeSource where - S: Source + 'static, - for<'a> S::Iter<'a>: Iterator, + S: Source, { - type Iter<'i> = MergeIter, &'i dyn Fn(&mut Vec, &Entry)>; - fn iter(&self) -> Self::Iter<'_> { + type Item = S::Item; + fn iter(&self) -> impl SeekableIter { self.source.iter().merge_func(&self.merge_func) } } diff --git a/src/merger.rs b/src/merger.rs index 6d611f6..5d9e371 100644 --- a/src/merger.rs +++ b/src/merger.rs @@ -136,11 +136,10 @@ impl> SeekableIter for MergeIter { impl Source for Merger where - S: Source + 'static, - for<'i> S::Iter<'i>: Iterator + 'i, + S: Source, { - type Iter<'i> = MergeIter>; - fn iter(&self) -> Self::Iter<'_> { + type Item = S::Item; + fn iter(&self) -> impl SeekableIter { MergeIter::from(self.sources.iter().map(|s| s.iter())) } } diff --git a/src/reader/mod.rs b/src/reader/mod.rs index d956d51..4ba0d7e 100644 --- a/src/reader/mod.rs +++ b/src/reader/mod.rs @@ -177,12 +177,9 @@ impl> SeekableIter for ReaderIter { } impl> Source for Reader { - type Iter<'i> - = ReaderIter - where - D: 'i; + type Item = Entry; - fn iter(&self) -> Self::Iter<'_> { + fn iter(&self) -> impl SeekableIter { ReaderIter { reader: self.clone(), next_offset: 0, diff --git a/src/source.rs b/src/source.rs index 23ea66f..adefa73 100644 --- a/src/source.rs +++ b/src/source.rs @@ -5,26 +5,24 @@ use crate::merge::MergeSource; use crate::{Entry, SeekableIter}; pub trait Source { - type Iter<'i>: SeekableIter - where - Self: 'i; + type Item; - fn iter(&self) -> Self::Iter<'_>; - fn get(&self, key: &[u8]) -> RangeIter> + fn iter(&self) -> impl SeekableIter; + fn get(&self, key: &[u8]) -> RangeIter> where - for<'a> as Iterator>::Item: PartialOrd<[u8]>, + Self::Item: PartialOrd<[u8]>, { RangeIter::new(self.iter(), key, key) } - fn get_prefix(&self, prefix: &[u8]) -> PrefixIter> + fn get_prefix(&self, prefix: &[u8]) -> PrefixIter> where - for<'a> as Iterator>::Item: AsRef<[u8]>, + Self::Item: AsRef<[u8]>, { PrefixIter::new(self.iter(), prefix) } - fn get_range(&self, start: &[u8], end: &[u8]) -> RangeIter> + fn get_range(&self, start: &[u8], end: &[u8]) -> RangeIter> where - for<'a> as Iterator>::Item: PartialOrd<[u8]>, + Self::Item: PartialOrd<[u8]>, { RangeIter::new(self.iter(), start, end) } @@ -40,11 +38,7 @@ pub trait Source { fn dupsort_func(self, dupsort_func: F) -> DupsortSource where Self: Sized, - F: Fn( - & as Iterator>::Item, - & as Iterator>::Item, - ) -> std::cmp::Ordering - + 'static, + F: Fn(&Self::Item, &Self::Item) -> std::cmp::Ordering + 'static, { DupsortSource::new(self, dupsort_func) } @@ -52,15 +46,15 @@ pub trait Source { fn filter(self, filter_func: F) -> FilterSource where Self: Sized, - F: Fn(& as Iterator>::Item, &mut Vec) -> bool + 'static, + F: Fn(&Self::Item, &mut Vec) -> bool + 'static, { FilterSource::new(self, filter_func) } } -impl Source for Box { - type Iter<'i> = Box as Iterator>::Item> + 'i>; - fn iter(&self) -> Self::Iter<'_> { +impl Source for Box { + type Item = S::Item; + fn iter(&self) -> impl SeekableIter { Box::new(self.as_ref().iter()) } } @@ -100,8 +94,8 @@ impl SeekableIter for VecIter<'_> { } impl Source for Vec { - type Iter<'i> = VecIter<'i>; - fn iter(&self) -> Self::Iter<'_> { + type Item = Entry; + fn iter(&self) -> impl SeekableIter { VecIter { index: 0, vec: self, @@ -145,8 +139,8 @@ pub mod test_source { } impl Source for TestSource { - type Iter<'i> = TestIter<'i>; - fn iter(&self) -> Self::Iter<'_> { + type Item = Entry; + fn iter(&self) -> impl SeekableIter { TestIter { source: self, off: 0, -- 2.50.1