1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#![crate_name = "sknife"]

/// Maps a vector/list based on a mapping function
///
/// # Arguments
///
/// * `map_fn` - A mapping function to apply to the list
/// * `vect` - A vector to apply the map to
///
/// # Example
///
/// ```
/// use sknife::collection::map;
/// let mut list = vec![1, 2, 3];
/// let plus_one = |x| x + 1;
/// map(plus_one, list.as_mut_slice());
/// 
/// ```
/// 
/// # Result
/// ```
/// vec![2, 3, 4];
/// ```
pub fn map<F, A, B> (
    mut map_fn: F, 
    vect: &mut [A]) -> Vec<B> 
    where F: FnMut(A) -> B,
    A: Clone {
    let mut list = vec![];

    for v in vect.iter() {
        let value = map_fn(v.clone());
        list.push(value);
    }

    list
}

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

    #[test]
    fn map_simple_list() {
        let mut list = vec![1, 2, 3];
        let expected_list = vec![2, 3, 4];
        assert_eq!(map(plus_one, list.as_mut_slice()), expected_list);
    }

    #[test]
    fn map_empty_list() {
        let mut list = vec![];
        let expected_list = vec![];
        assert_eq!(map(plus_one, list.as_mut_slice()), expected_list);
    }

    fn plus_one(n: i32) -> i32 {
        match n {
            x if x > 0 => n + 1,
            _ => 1
        }
    }
}