macro_rules! merge {
    ($($s : expr), * $(,) ?) => { ... };
}
Expand description

Callbag factory that merges data from multiple callbag sources.

Works well with listenable sources, and while it may work for some pullable sources, it is only designed for listenable sources.

See https://github.com/staltz/callbag-merge/blob/eefc5930dd5dba5197e4b49dc8ce7dae67be0e6b/readme.js#L29-L60

Examples

use async_executors::TimerExt;
use async_nursery::Nursery;
use crossbeam_queue::SegQueue;
use std::{sync::Arc, time::Duration};

use callbag::{for_each, interval, merge};

let (nursery, nursery_out) = Nursery::new(async_executors::AsyncStd);

let actual = Arc::new(SegQueue::new());

let source = merge!(
    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(650), 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
    }[..],
    [0, 1, 2, 0, 3, 4, 5]
);