2 个版本 (1 个稳定版)
1.0.0 | 2022年7月21日 |
---|---|
0.1.0 | 2022年7月21日 |
#1494 in 异步
18KB
360 行
async-middleware
提供一个方法,可以将多个异步中间件函数串联起来,在输入 -> 输出的每个中间件之间都是类型安全的。这允许您像 monad 一样组合 A -> B -> C,但又不那么正式。尽管在理论上可以将它用作 monad 库,但它并没有真正设置来处理身份、映射、解包、for(更正式和惯用的方法 https://medium.com/swlh/monad-interface-rust-edition-bd6486b93607 会更好),但是缺少一些使这更容易的东西,比如异步闭包。由于 Rust 中缺少异步闭包,像包装现有的异步函数这样的东西是非常困难的。无论如何,这提供了一种简单的中间件链式调用。
示例
// import * as this provides all the trait implementations by default
use async_middleware::*;
async fn producer() -> i32 {
3
}
async fn multipler(i: i32) -> i32 {
i * 32
}
async fn stringer(i: i32) -> String {
i.to_string()
}
async fn logger(s: String) {
println!("{}", s);
}
async fn log_nums(i: i32) {
println!("{}", i);
}
#[test]
fn test_piper_tuple() {
pipe((producer, log_nums));
pipe((producer, stringer, logger));
pipe((producer, multipler, stringer, logger));
pipe((multipler, multipler, multipler));
pipe((multipler, multipler, stringer));
// alternative syntax
(producer, log_nums).pipe();
(producer, stringer, logger).pipe();
(producer, multipler, stringer, logger).pipe();
(multipler, multipler, multipler).pipe();
(multipler, multipler, stringer).pipe();
// pipe different pipes
let m = (producer, multipler).pipe();
let m = (m, multipler).pipe();
let m = pipe((m, stringer));
assert_eq!(String::from("3072"), m.call(()).await);
}
#[async_std::test]
async fn test_piper_tuple_inputs() {
let m = (multipler, multipler, stringer).pipe();
assert_eq!(String::from("1024"), m.call(1).await);
assert_eq!(String::from("2048"), m.call(2).await);
assert_eq!(String::from("3072"), m.call(3).await);
}
#[test]
fn test_convert_transform() {
convert(multipler, stringer);
convert(multipler, multipler);
}
#[test]
fn test_source_transform() {
convert(producer, multipler);
}
#[test]
fn test_source_sink() {
convert(producer, log_nums);
}
#[test]
fn test_transform() {
convert(convert(producer, multipler), stringer);
}
#[test]
fn test_transform_source_transform_sink() {
convert(convert(convert(producer, multipler), stringer), logger);
}
依赖项
~280–730KB
~18K SLoC