From 62670dbbf7d538d2b209735cbb238188703a445b Mon Sep 17 00:00:00 2001 From: Filipe Rodrigues Date: Fri, 23 Feb 2024 14:36:39 +0000 Subject: [PATCH] Added `IteratorLoadableExt::scan_loaded`. --- dynatos-loadable/src/loadable.rs | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/dynatos-loadable/src/loadable.rs b/dynatos-loadable/src/loadable.rs index cefded8..d0d9e49 100644 --- a/dynatos-loadable/src/loadable.rs +++ b/dynatos-loadable/src/loadable.rs @@ -239,6 +239,18 @@ where Loadable::Loaded(None) } + + /// [`Iterator::scan`]-like adaptor + fn scan_loaded(self, init: St, f: F) -> ScanLoaded + where + F: FnMut(&mut St, T) -> Option, + { + ScanLoaded { + inner: self, + f, + state: init, + } + } } /// Iterator returned by [`IteratorLoadableExt::flatten_loaded`] @@ -290,6 +302,36 @@ where } } +/// Iterator returned by [`IteratorLoadableExt::scan_loaded`] +#[derive(Clone, Copy, Debug)] +pub struct ScanLoaded { + /// Inner iterator + inner: I, + + /// Function + f: F, + + /// State + state: St, +} + +impl Iterator for ScanLoaded +where + I: Iterator>, + F: FnMut(&mut St, T) -> Option, +{ + type Item = Loadable; + + fn next(&mut self) -> Option { + let value = match self.inner.next()? { + Loadable::Empty => return Some(Loadable::Empty), + Loadable::Err(err) => return Some(Loadable::Err(err)), + Loadable::Loaded(value) => value, + }; + (self.f)(&mut self.state, value).map(Loadable::Loaded) + } +} + /// Extension trait to create a [`Loadable::Loaded`] from a value. #[extend::ext(name = IntoLoaded)] pub impl T {