shuffled-iter 0.2.0

Iterate through a set of values in random order without allocating them all
Documentation
macro_rules! range_tests {($prim:ident) => {
    mod $prim {
        use iter::ShuffledIterGen;

        fn test(min: $prim, max: $prim, iter: ::iter::$prim::Iter) {
            let cnt = (max - min + 1) as usize;
            let mut bv = ::bit_vec::BitVec::from_elem(cnt, false);

            for i in iter {
                assert!(min <= i && i <= max);

                let i = (i - min) as usize;
                assert!(bv.get(i) == Some(false));
                bv.set(i, true);
            }

            assert!(bv.all());
        }

        #[test]
        fn min() {
            let mut rng = ::rand::XorShiftRng::new_unseeded();
            let iter = rng.iter_shuffled(.. ::std::$prim::MIN + 10);
            test(::std::$prim::MIN, ::std::$prim::MIN + 9, iter);
        }

        #[test]
        fn max() {
            let mut rng = ::rand::XorShiftRng::new_unseeded();
            let iter = rng.iter_shuffled(::std::$prim::MAX - 10 ..);
            test(::std::$prim::MAX - 10, ::std::$prim::MAX, iter);
        }

        #[test]
        fn median() {
            let mut rng = ::rand::XorShiftRng::new_unseeded();
            let median = ::std::$prim::MIN / 2 + ::std::$prim::MAX / 2;
            let iter = rng.iter_shuffled(median - 5 .. median + 5);
            test(median - 5, median + 4, iter);
        }
    }
}}

macro_rules! ranges_tests {($($prim:ident),+) => {$(
    range_tests!($prim);
)*}}

ranges_tests!(u8, u16, u32, u64, usize, i8, i16, i32, isize);