2 个不稳定版本
0.1.0 | 2021年9月11日 |
---|---|
0.0.0 | 2021年9月9日 |
在 异步 分类中排名 #891
每月下载量 1,090 次
在 2 个包中使用(通过 vtubestudio)
42KB
816 行
此仓库是一个 Rust crate,提供了一个 futures::Stream
扩展 trait,允许使用一个检查每个 Stream::Item
的谓词函数将 Stream
拆分为两个流。
use split_stream_by::SplitStreamByExt;
let incoming_stream = futures::stream::iter([0,1,2,3,4,5]);
let (mut even_stream, mut odd_stream) = incoming_stream.split_by(|&n| n % 2 == 0);
tokio::spawn(async move {
while let Some(even_number) = even_stream.next().await {
println!("Even {}",even_number);
}
});
while let Some(odd_number) = odd_stream.next().await {
println!("Odd {}",odd_number);
}
更高级的用法使用 split_by_map
,允许在拆分的同时提取值
use split_stream_by::{Either,SplitStreamByExt};
struct Request {
//...
}
struct Response {
//...
}
enum Message {
Request(Request),
Response(Response)
}
let incoming_stream = futures::stream::iter([
Message::Request(Request {}),
Message::Response(Response {}),
Message::Response(Response {}),
]);
let (mut request_stream, mut response_stream) = incoming_stream.split_by_map(|item| match item {
Message::Request(req) => Either::Left(req),
Message::Response(res) => Either::Right(res),
});
tokio::spawn(async move {
while let Some(request) = request_stream.next().await {
// ...
}
});
while let Some(response) = response_stream.next().await {
// ...
}
在其当前实现中,当请求下一个项目的流不是匹配谓词的流时,它只能缓冲一个元素。将来,这可能通过使用 const 泛型参数来配置
依赖项
~1–1.7MB
~34K SLoC