macro_rules! combine {
($($s : expr), + $(,) ?) => { ... };
}
Expand description
Callbag factory that combines the latest data points from multiple (2 or more) callbag sources.
It delivers those latest values as a tuple.
Works with both pullable and listenable sources.
Examples
use async_executors::TimerExt;
use async_nursery::Nursery;
use crossbeam_queue::SegQueue;
use std::{sync::Arc, time::Duration};
use callbag::{combine, for_each, interval};
let (nursery, nursery_out) = Nursery::new(async_executors::AsyncStd);
let actual = Arc::new(SegQueue::new());
let source = combine!(
interval(Duration::from_millis(100), nursery.clone()),
interval(Duration::from_millis(350), nursery.clone()),
);
for_each({
let actual = Arc::clone(&actual);
move |x| {
println!("{:?}", x);
actual.push(x);
}
})(source);
let nursery_out = nursery.timeout(Duration::from_millis(1_000), nursery_out);
drop(nursery);
async_std::task::block_on(nursery_out);
assert_eq!(
&{
let mut v = vec![];
for _i in 0..actual.len() {
v.push(actual.pop().unwrap());
}
v
}[..],
[
(2, 0),
(3, 0),
(4, 0),
(5, 0),
(6, 0),
(6, 1),
(7, 1),
(8, 1),
]
);
Implementation notes
Due to a temporary restriction in Rust’s type system, the Combine
trait is only implemented
on tuples of arity 12 or less.