sasja_euler 0.1.2

sasja is learning rust and doing some project euler
Documentation
//! this is all the documentation for now

pub fn is_prime(n: u64) -> bool
{
    if n == 2 { return true };
    if n % 2 == 0 { return false };

    let max: u64 = (n as f64).sqrt() as u64 + 1; 

    let mut d = 3;
    while d <= max {
        if n % d == 0 { return false };
        d += 2;
    }
    true
}

pub fn permutations<'a,T>(input: &Vec<&'a T>) -> Vec<Vec<&'a T>> {
    let mut result = Vec::new();

    if input.len() == 1 {
        result.push(vec![input[0]]);
    } else {
        for (i,&v) in input.iter().enumerate() {
            let without = input.iter().enumerate()
                            .filter(|&(i2,_)| i2 != i)
                            .map(|(_,&b)| b)
                            .collect();

            for mut p in permutations(&without) {
                let mut item = vec![v];
                item.append(&mut p);
                result.push(item);
            }
        }
    }
    result
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn is_prime_positives() {
        for p in vec![1,2,3,5,7,13,17,19,23,105199,179425331,32416190071] {
            assert!(is_prime(p), "p={}", p);
        }
    }

    #[test]
    fn is_prime_negatives() {
        for p in vec![4,6,8,9,10,12,14,15,16,18,20,32193578231536531] {
            assert!(!is_prime(p), "p={}", p);
        }
    }

    #[test]
    fn permutations_1() {
        assert_eq!(permutations(&vec![&0]), vec![vec![&0]]);
        assert_eq!(permutations(&vec![&0,&1]), vec![vec![&0,&1],vec![&1,&0]]);
        assert_eq!(permutations(&vec![&0,&1,&2]),vec![
                   vec![&0,&1,&2],
                   vec![&0,&2,&1],
                   vec![&1,&0,&2],
                   vec![&1,&2,&0],
                   vec![&2,&0,&1],
                   vec![&2,&1,&0]]);
    }

    #[test]
    fn permutations_2() {
        assert_eq!(permutations(&vec![&'a',&'b']),
                   vec![vec![&'a',&'b'], vec![&'b',&'a']]);
    }
}