more_itertools/selecting/
take.rs

1
2pub fn take<T>(iter: &mut Box<dyn Iterator<Item = T>>, n: usize) -> Vec<T> 
3where
4T: 'static
5{
6    let mut ret = Vec::new();
7
8    for _ in 0..n {
9        let item = iter.next();
10        match item {
11            None => { break; }
12            Some(v) => {
13                ret.push(v);
14            }
15        }
16    }
17
18    return ret;
19}
20
21#[cfg(test)]
22mod tests {
23
24    use crate::itertools::iter::iter_from_vec;
25
26    use super::*;
27
28    #[test]
29    fn test1() {
30        let v1 = vec![1,2,3,4,5];
31
32        let mut iter1 = iter_from_vec(v1);
33
34        assert_eq!(vec![1,2,3], take(&mut iter1, 3));
35
36        assert_eq!(vec![4,5], iter1.collect::<Vec<_>>());
37
38        let v2 = vec![1,2,3,4,5];
39
40        assert_eq!(vec![1,2,3,4,5], take(&mut iter_from_vec(v2), 10));
41    }
42}