future-clicker 0.1.1

Reimplementation of manual_future without using `futures` unstable
Documentation
use std::{
    thread::{sleep, spawn},
    time::Duration,
};

use tokio::runtime::Handle;
use tracing::{instrument, trace};
use tracing_test::traced_test;

use future_clicker::{ControlledFuture, FutureClicker};

#[tokio::test]
#[traced_test]
async fn test_completed() {
    let (future, completer) = ControlledFuture::<usize>::new();

    assert_eq!(completer.complete(9876), Ok(()));

    assert_eq!(future.await, Ok(9876));
}

#[tokio::test]
#[traced_test]
async fn test_pre_completed() {
    assert_eq!(ControlledFuture::new_completed(1234usize).await, Ok(1234));
}

#[tokio::test(flavor = "multi_thread")]
#[traced_test]
async fn test_threaded() {
    let (future, completer) = ControlledFuture::<usize>::new();

    #[instrument(skip_all)]
    fn create_t1(handle: Handle, future: ControlledFuture<usize>) -> impl FnOnce() {
        self::trace!("create t1");
        move || {
            self::trace!("run t1");
            futures::executor::block_on(async {
                self::trace!("exec t1");
                assert_eq!(
                    handle.spawn(future).await.expect("Task t1 panicked"),
                    Ok(6353)
                );
                self::trace!("done t1");
            });
        }
    }

    #[instrument(skip_all)]
    fn create_t2(completer: FutureClicker<usize>) -> impl FnOnce() {
        self::trace!("create t2");
        move || {
            self::trace!("run t2");
            sleep(Duration::from_millis(100));
            self::trace!("slept t2");
            completer.complete(6353).unwrap();
        }
    }

    let t1 = spawn(create_t1(Handle::current(), future));
    let t2 = spawn(create_t2(completer));

    self::trace!("spawned");

    t1.join().unwrap();
    self::trace!("t1 joined");
    t2.join().unwrap();
    self::trace!("t2 joined");
}