diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2019-10-26 20:23:00 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2019-10-27 13:39:34 +0100 |
commit | cc8150e0a96f790363ec3400e8ec493b52dea1a8 (patch) | |
tree | 2827ec0aa2e2a3bfb4311b39707f389851701d7b /lib/core | |
parent | 39cf75a532c7b4eb4f76c807dd3131a96cf0ae71 (diff) |
Add extension trait for iterator over Result<Entry>
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
Diffstat (limited to 'lib/core')
-rw-r--r-- | lib/core/libimagrt/src/iter.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/core/libimagrt/src/iter.rs b/lib/core/libimagrt/src/iter.rs index 282570ad..c0d179c9 100644 --- a/lib/core/libimagrt/src/iter.rs +++ b/lib/core/libimagrt/src/iter.rs @@ -61,6 +61,46 @@ mod reporting { } + pub trait ReportTouchedResultEntry<'a, I, D> + where I: Iterator<Item = Result<D>>, + D: Deref<Target = Entry>, + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedResultEntryImpl<'a, I, D>; + } + + impl<'a, I, D> ReportTouchedResultEntry<'a, I, D> for I + where I: Iterator<Item = Result<D>>, + D: Deref<Target = Entry>, + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedResultEntryImpl<'a, I, D> { + ReportTouchedResultEntryImpl(self, rt) + } + } + + pub struct ReportTouchedResultEntryImpl<'a, I, D>(I, &'a Runtime<'a>) + where I: Iterator<Item = Result<D>>, + D: Deref<Target = Entry>; + + impl<'a, I, D> Iterator for ReportTouchedResultEntryImpl<'a, I, D> + where I: Iterator<Item = Result<D>>, + D: Deref<Target = Entry>, + { + type Item = Result<D>; + + fn next(&mut self) -> Option<Self::Item> { + self.0.next() + .map(|r| { + r.and_then(|e| { + self.1 + .report_touched(e.get_location()) + .map_err(Error::from) + .map(|_| e) + }) + }) + } + } + + pub trait ReportTouchedStoreId<'a, I> |