bombs 0.2.1

Efficient single-producer multi-consumer channel types.
Documentation
#[test]
fn threaded_multi_u32() {
    use bombs::blocking::MultiBomb;
    use std::thread;

    let (mut fuse, bomb) = MultiBomb::new();

    let handles = (0..2).into_iter().map(move |_| {
        let mut bomb_clone = bomb.clone();

        thread::spawn(move || {
            let value = bomb_clone.wait_for_explosion();
            assert_eq!(value, 5);
            let value = bomb_clone.wait_for_explosion();
            assert_eq!(value, 24);
        })
    }).collect::<Vec<_>>();

    let flame = fuse.light(5_u32);

    flame.wait_for_extinguish();
    assert!(flame.extinguished());

    let flame = fuse.light(24);

    flame.wait_for_extinguish();
    assert!(flame.extinguished());

    handles.into_iter().for_each(|h| h.join().unwrap());
}

#[test]
fn threaded_u32() {
    use bombs::blocking::Bomb;
    use std::thread;

    let (fuse, bomb) = Bomb::new();

    let handles = (0..2).into_iter().map(move |_| {
        let bomb_clone = bomb.clone();

        thread::spawn(move || {
            let value = bomb_clone.wait_for_explosion();
            assert_eq!(*value, 5);
        })
    }).collect::<Vec<_>>();

    let flame = fuse.light(5_u32);

    flame.wait_for_extinguish();
    assert!(flame.extinguished());

    handles.into_iter().for_each(|h| h.join().unwrap());
}

#[test]
fn simple_u32() {
    use bombs::blocking::Bomb;

    let (fuse, bomb) = Bomb::new();

    let bomb_clone = bomb.clone();

    assert_eq!(bomb.exploded(), None);
    assert_eq!(bomb_clone.exploded(), None);

    let flame = fuse.light(7_u32);

    assert_eq!(bomb.exploded(), Some(&7));
    assert_eq!(bomb_clone.wait_for_explosion(), &7);

    assert!(!flame.extinguished());

    drop(bomb_clone);
    drop(bomb);

    assert!(flame.extinguished());
}

#[test]
fn empty_u32() {
    use bombs::blocking::Bomb;

    let (fuse, bomb) = Bomb::<u32>::new();
    let bomb_clone = bomb.clone();

    assert_eq!(bomb.exploded(), None);
    assert_eq!(bomb_clone.exploded(), None);

    let _fuse = std::hint::black_box(fuse);
}