diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2019-10-25 17:20:56 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2019-10-27 13:39:34 +0100 |
commit | 39cf75a532c7b4eb4f76c807dd3131a96cf0ae71 (patch) | |
tree | 51f4f636107c8ba0a3412751df44cc1330e6b17a | |
parent | b6facfff6b6c6adca609ad8618659b2ac34c3442 (diff) |
Add iterator extensions for store-id touched reporting
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | lib/core/libimagrt/src/iter.rs | 139 | ||||
-rw-r--r-- | lib/core/libimagrt/src/lib.rs | 1 |
2 files changed, 140 insertions, 0 deletions
diff --git a/lib/core/libimagrt/src/iter.rs b/lib/core/libimagrt/src/iter.rs new file mode 100644 index 00000000..282570ad --- /dev/null +++ b/lib/core/libimagrt/src/iter.rs @@ -0,0 +1,139 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015-2019 Matthias Beyer <mail@beyermatthias.de> and contributors +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; version +// 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// + +/// Iterator extension helpers for `Runtime::report_touched` +mod reporting { + use std::ops::Deref; + + use libimagstore::store::Entry; + use libimagstore::storeid::StoreId; + use failure::Fallible as Result; + use failure::Error; + + use runtime::Runtime; + + + pub trait ReportTouchedEntry<'a, I, D> + where I: Iterator<Item = D>, + D: Deref<Target = Entry>, + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedEntryImpl<'a, I, D>; + } + + impl<'a, I, D> ReportTouchedEntry<'a, I, D> for I + where I: Iterator<Item = D>, + D: Deref<Target = Entry>, + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedEntryImpl<'a, I, D> { + ReportTouchedEntryImpl(self, rt) + } + } + + pub struct ReportTouchedEntryImpl<'a, I, D>(I, &'a Runtime<'a>) + where I: Iterator<Item = D>, + D: Deref<Target = Entry>; + + impl<'a, I, D> Iterator for ReportTouchedEntryImpl<'a, I, D> + where I: Iterator<Item = D>, + D: Deref<Target = Entry>, + { + type Item = Result<D>; + + fn next(&mut self) -> Option<Self::Item> { + self.0.next().map(|e| self.1.report_touched(e.get_location()).map_err(Error::from).map(|_| e)) + } + } + + + + + pub trait ReportTouchedStoreId<'a, I> + where I: Iterator<Item = StoreId> + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedStoreIdImpl<'a, I>; + } + + impl<'a, I> ReportTouchedStoreId<'a, I> for I + where I: Iterator<Item = StoreId>, + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedStoreIdImpl<'a, I> { + ReportTouchedStoreIdImpl(self, rt) + } + } + + pub struct ReportTouchedStoreIdImpl<'a, I>(I, &'a Runtime<'a>) + where I: Iterator<Item = StoreId>; + + impl<'a, I> Iterator for ReportTouchedStoreIdImpl<'a, I> + where I: Iterator<Item = StoreId>, + { + type Item = Result<StoreId>; + + fn next(&mut self) -> Option<Self::Item> { + self.0 + .next() + .map(|id| { + self.1 + .report_touched(&id) + .map_err(Error::from) + .map(|_| id) + }) + } + } + + + + pub trait ReportTouchedResultStoreId<'a, I> + where I: Iterator<Item = Result<StoreId>> + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedResultStoreIdImpl<'a, I>; + } + + impl<'a, I> ReportTouchedResultStoreId<'a, I> for I + where I: Iterator<Item = Result<StoreId>>, + { + fn map_report_touched(self, rt: &'a Runtime) -> ReportTouchedResultStoreIdImpl<'a, I> { + ReportTouchedResultStoreIdImpl(self, rt) + } + } + + pub struct ReportTouchedResultStoreIdImpl<'a, I>(I, &'a Runtime<'a>) + where I: Iterator<Item = Result<StoreId>>; + + impl<'a, I> Iterator for ReportTouchedResultStoreIdImpl<'a, I> + where I: Iterator<Item = Result<StoreId>>, + { + type Item = Result<StoreId>; + + fn next(&mut self) -> Option<Self::Item> { + self.0 + .next() + .map(|rid| { + rid.and_then(|id| { + self.1 + .report_touched(&id) + .map_err(Error::from) + .map(|_| id) + }) + }) + } + } +} + +pub use self::reporting::*; diff --git a/lib/core/libimagrt/src/lib.rs b/lib/core/libimagrt/src/lib.rs index f9d349c0..afa5534f 100644 --- a/lib/core/libimagrt/src/lib.rs +++ b/lib/core/libimagrt/src/lib.rs @@ -59,6 +59,7 @@ pub mod application; pub mod configuration; pub mod logger; pub mod io; +pub mod iter; pub mod runtime; pub mod setup; pub mod spec; |