use crate::sync::{Co, Gen};
use std::{future::Future, pin::Pin};
#[allow(clippy::module_name_repetitions)]
pub type GenBoxed<Y, R = (), C = ()> =
Gen<Y, R, Pin<Box<dyn Future<Output = C> + Send>>>;
impl<Y, R, C> GenBoxed<Y, R, C> {
pub fn new_boxed<F>(producer: impl FnOnce(Co<Y, R>) -> F) -> Self
where
F: Future<Output = C> + Send + 'static,
{
Self::new(|co| Box::pin(producer(co)))
}
}
#[cfg(test)]
mod tests {
use crate::{
ops::GeneratorState,
sync::{Co, Gen},
};
use std::sync::{Arc, Mutex};
async fn odd_numbers_less_than_ten(co: Co<i32>) {
for n in (1..).step_by(2).take_while(|&n| n < 10) {
co.yield_(n).await;
}
}
#[test]
fn can_be_stored_in_static() {
let gen = Gen::new_boxed(odd_numbers_less_than_ten);
let _: &dyn Send = &gen;
let arc = Arc::new(Mutex::new(gen));
let _: &dyn Sync = &arc;
let mut guard = arc.lock().unwrap();
assert_eq!(guard.resume(), GeneratorState::Yielded(1));
assert_eq!(guard.resume(), GeneratorState::Yielded(3));
}
}