summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-10-25 17:20:56 +0200
committerMatthias Beyer <mail@beyermatthias.de>2019-10-27 13:39:34 +0100
commit39cf75a532c7b4eb4f76c807dd3131a96cf0ae71 (patch)
tree51f4f636107c8ba0a3412751df44cc1330e6b17a
parentb6facfff6b6c6adca609ad8618659b2ac34c3442 (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.rs139
-rw-r--r--lib/core/libimagrt/src/lib.rs1
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;