From dcc9e6e794c46efb9b0fa368d3b771f55857520b Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 14 Aug 2023 22:32:06 +0200 Subject: [PATCH] minedmap/region_group: add async map functions --- src/bin/minedmap/region_group.rs | 43 +++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/bin/minedmap/region_group.rs b/src/bin/minedmap/region_group.rs index aa7088c..1f87b1c 100644 --- a/src/bin/minedmap/region_group.rs +++ b/src/bin/minedmap/region_group.rs @@ -1,6 +1,7 @@ -use std::iter; +use std::{future::Future, iter}; use anyhow::Result; +use futures_util::future::OptionFuture; /// A generic array of 3x3 elements /// @@ -70,6 +71,46 @@ impl RegionGroup { Ok(RegionGroup { center, neighs }) } + #[allow(dead_code)] + pub async fn async_map(self, mut f: F) -> RegionGroup + where + Fut: Future, + F: FnMut(T) -> Fut, + { + let center = f(self.center); + let neighs = futures_util::future::join_all( + self.neighs + .map(|entry| OptionFuture::from(entry.map(&mut f))), + ); + let (center, neighs) = futures_util::join!(center, neighs); + RegionGroup { + center, + neighs: <[Option<_>; 9]>::try_from(neighs).ok().unwrap(), + } + } + + pub async fn async_try_map(self, mut f: F) -> Result> + where + Fut: Future>, + F: FnMut(T) -> Fut, + { + let center = f(self.center); + let neighs = futures_util::future::join_all( + self.neighs + .map(|entry| OptionFuture::from(entry.map(&mut f))), + ); + let (center, neighs) = futures_util::join!(center, neighs); + let center = center?; + + let neighs: Vec<_> = neighs + .into_iter() + .map(|entry| entry.and_then(Result::ok)) + .collect(); + let neighs = <[Option<_>; 9]>::try_from(neighs).ok().unwrap(); + + Ok(RegionGroup { center, neighs }) + } + pub fn iter(&self) -> impl Iterator { iter::once(&self.center).chain(self.neighs.iter().filter_map(Option::as_ref)) }