ephemeropt 0.3.0

An ephemeral Option that reverts to None after some time
Documentation
use ephemeropt::EphemeralOption;
use std::time::Duration;
use sysinfo::{CpuExt, System, SystemExt};
use tokio::sync::{mpsc, oneshot};

fn cpu_task() -> mpsc::Sender<oneshot::Sender<f32>> {
    let mut sys = System::new();
    let mut cpu_opt = EphemeralOption::new_empty(Duration::from_secs(1));
    let (tx, mut rx) = mpsc::channel::<oneshot::Sender<f32>>(10);
    tokio::task::spawn(async move {
        while let Some(channel) = rx.recv().await {
            if let Some(&cpu) = cpu_opt.get() {
                eprintln!("using cached CPU data");
                channel.send(cpu).unwrap();
            } else {
                sys.refresh_cpu();
                let cpu = sys.global_cpu_info().cpu_usage();
                channel.send(cpu).unwrap();
                cpu_opt.insert(cpu);
            }
        }
    });
    tx
}

#[tokio::main]
async fn main() {
    let sys_tx = cpu_task();

    for _ in 0..3 {
        let sys_tx = sys_tx.clone();
        tokio::spawn(async move {
            loop {
                let (resp_tx, resp_rx) = oneshot::channel();
                sys_tx.send(resp_tx).await.unwrap();
                println!("CPU usage: {}", resp_rx.await.unwrap());
                tokio::time::sleep(Duration::from_millis(250)).await;
            }
        })
        .await
        .unwrap();

        tokio::time::sleep(Duration::from_millis(100)).await;
    }
}