mirror of https://github.com/KaiserY/trpl-zh-cn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
1 month ago
|
extern crate trpl; // required for mdbook test
|
||
|
|
||
|
use std::{pin::pin, time::Duration};
|
||
|
|
||
|
use trpl::{ReceiverStream, Stream, StreamExt};
|
||
|
|
||
|
fn main() {
|
||
|
trpl::run(async {
|
||
|
// ANCHOR: throttle
|
||
|
let messages = get_messages().timeout(Duration::from_millis(200));
|
||
|
let intervals = get_intervals()
|
||
|
.map(|count| format!("Interval: {count}"))
|
||
|
.throttle(Duration::from_millis(100))
|
||
|
.timeout(Duration::from_secs(10));
|
||
|
let merged = messages.merge(intervals).take(20);
|
||
|
let mut stream = pin!(merged);
|
||
|
// ANCHOR_END: throttle
|
||
|
|
||
|
while let Some(result) = stream.next().await {
|
||
|
match result {
|
||
|
Ok(message) => println!("{message}"),
|
||
|
Err(reason) => eprintln!("Problem: {reason:?}"),
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
|
||
|
fn get_messages() -> impl Stream<Item = String> {
|
||
|
let (tx, rx) = trpl::channel();
|
||
|
|
||
|
trpl::spawn_task(async move {
|
||
|
let messages = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"];
|
||
|
for (index, message) in messages.into_iter().enumerate() {
|
||
|
let time_to_sleep = if index % 2 == 0 { 100 } else { 300 };
|
||
|
trpl::sleep(Duration::from_millis(time_to_sleep)).await;
|
||
|
|
||
|
tx.send(format!("Message: '{message}'")).unwrap();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
ReceiverStream::new(rx)
|
||
|
}
|
||
|
|
||
|
fn get_intervals() -> impl Stream<Item = u32> {
|
||
|
let (tx, rx) = trpl::channel();
|
||
|
|
||
|
trpl::spawn_task(async move {
|
||
|
let mut count = 0;
|
||
|
loop {
|
||
|
trpl::sleep(Duration::from_millis(1)).await;
|
||
|
count += 1;
|
||
|
tx.send(count).unwrap();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
ReceiverStream::new(rx)
|
||
|
}
|