swansong 0.3.4

Graceful Shutdown
Documentation
use futures_lite::{stream::unfold, StreamExt};

fn main() {
    use async_global_executor as executor;
    use async_io::Timer;
    use std::{future::pending, pin::pin, time::Duration};
    use swansong::Swansong;
    futures_lite::future::block_on(async {
        let swansong = Swansong::new();
        executor::spawn(swansong.interrupt(pending::<()>()).guarded()).detach();
        executor::spawn({
            let swansong = swansong.clone();
            async move {
                let mut stream = pin!(swansong.interrupt(unfold((), |()| async {
                    Timer::after(Duration::from_millis(100)).await;
                    Some((fastrand::u8(..), ()))
                })));

                while let Some(n) = stream.next().await {
                    println!("{n}");
                }
            }
        })
        .detach();
        executor::spawn(swansong.guarded(Timer::after(Duration::from_secs(1)))).detach();
        swansong.shut_down().await;
    });
}