use std::borrow::Borrow;
use futures::future::join_all;
use serde::{Deserialize, Serialize};
use crate::{func::WebWorkerFn, global::has_worker_pool, worker_pool};
pub trait IteratorExt<T>: Sized + Iterator
where
Self::Item: Borrow<T>,
T: Serialize + for<'de> Deserialize<'de>,
{
#[allow(async_fn_in_trait)]
async fn par_map<R>(self, func: WebWorkerFn<T, R>) -> Vec<R>
where
R: Serialize + for<'de> Deserialize<'de>,
{
let pool = worker_pool().await;
join_all(self.map(|arg| pool.run_internal(func, arg))).await
}
#[allow(async_fn_in_trait)]
async fn try_par_map<R>(self, func: WebWorkerFn<T, R>) -> Vec<R>
where
Self::Item: Into<T>,
R: Serialize + for<'de> Deserialize<'de>,
{
if has_worker_pool() {
self.par_map(func).await
} else {
self.map(|item| (func.func)(item.into())).collect()
}
}
}
impl<T, I> IteratorExt<T> for I
where
I: Iterator,
I::Item: Borrow<T>,
T: Serialize + for<'de> Deserialize<'de>,
{
}