mod common;
use
{
async_executors :: { AsyncStd } ,
async_nursery :: { Nursery, Nurse, NurseExt } ,
common :: { DynResult } ,
futures :: { StreamExt } ,
};
async fn return_value() -> DynResult<usize>
{
let (nursery, output) = Nursery::new( AsyncStd );
nursery.nurse( produce_value () )?;
nursery.nurse( produce_value2() )?;
produce_value3( &nursery )?;
drop(nursery);
let sum = output.fold( 0, |acc, x| async move { acc + x } ).await;
Ok( sum )
}
async fn produce_value () -> usize { 5 }
async fn produce_value2() -> usize { 10 }
fn produce_value3( nursery: &(impl Nurse<usize> + Send + 'static) ) -> DynResult<()>
{
nursery.nurse( produce_value () )?;
nursery.nurse( produce_value2() )?;
Ok(())
}
#[ async_std::main ]
async fn main() -> DynResult<()>
{
let sum = return_value().await?;
assert_eq!( sum, 30 );
println!( "Total of all concurrent operations is: {}.", sum );
Ok(())
}