agenda 0.0.1

Safe collections that can be mutated while being iterated through
Documentation

use Queue;

#[derive(Debug)]
struct Num(u8);

#[test]
fn queue() {
    let queue: Queue<Num> = Queue::new();
    queue.push(Num(1));

    let mut count = 0;
    for elem in queue.iter() {
        count += 1;
        if elem.0 < 100 {
            queue.push(Num(elem.0 + 1));
        }
    }
    assert_eq!(count, 100);
}

#[test]
fn reverse_order() {
    use std::collections::HashMap;
    let input = 1..10;  // exclude 0 which will increase `total` but not sum
    let queue: Queue<u8> = input.clone().into_iter().collect();

    let mut counts: HashMap<u8,u8> = HashMap::new();
    let mut total = 0u8;
    let mut prev = input.end;

    for elem in queue.iter().rev() {
        total += 1;
        assert!(elem <= prev && elem >= prev - 1, "traversal was out of order");
        prev = elem;

        let n = counts.entry(elem).or_insert(0);
        *n += 1;
        if *n < elem {
            queue.push(elem);
        }
    }

    assert_eq!(total, input.sum(), "Iterated through wrong number of elements");
}