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.

See https://github.com/staltz/callbag-combine/blob/44b4f0f4295e0f5f9dbe9610d0548beca93fe376/readme.js#L32-L71

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.