5 个版本

0.3.4 2021年8月30日
0.3.3 2021年8月27日
0.2.3 2021年8月23日
0.1.0 2021年8月9日

#12 in #timeline

自定义许可

15KB
419 代码行数(不包括注释)

Timewrap

这是一个支持虚拟时间线的 Rust 库,具有与 Rust 的异步生态系统兼容的能力。在其内部,用户可以执行可以 await 指定虚拟时间的异步任务,并按 await 等待的时间顺序运行。它实际上并不等待现实世界中的时间,而是通过给定的虚拟时间确保执行顺序。

它对于编写具有与真实时间解耦的时间维度的游戏或模拟逻辑非常有用,可以使用简洁的异步协程编码风格,而不是事件处理、手动编写的状态机或回调地狱。

如何使用它

一个非常简单的示例可以在单元测试中找到。

// Initialize a Timewrap instance with an attached state.
let result = Mutex::new(String::new());
let timewrap = Timewrap::new_with_state(result);

// Spawn just like you do with `tokio`, but does not need to be 'static.
timewrap.spawn(async_fn!(|timewrap| {
    use std::fmt::Write;

    // Spawn another task within a running task.
    timewrap.spawn(async {
        for i in 0..3 {
            timewrap.delay(10).await;
            let mut result = timewrap.lock().await;
            write!(result, "a{}", i).unwrap();
        }
    });

    timewrap.delay(5).await;

    for i in 0..3 {
        timewrap.delay(10).await;
        let mut result = timewrap.lock().await;
        write!(result, "b{}", i).unwrap();
    }
}));

// Drive the Timewrap to the estimated time synchronously.
timewrap.drive_shared_block(35);

// Consume the result.
let result = timewrap.into_state().into_inner();
assert_eq!(result, "a0b0a1b1a2b2");

依赖项

~1.4–2MB
~31K SLoC