more_itertools/selecting/
first.rs1use crate::error::Error;
2use crate::error;
3
4pub fn first<T>(iter: &mut Box<dyn Iterator<Item = Result<T,Error>>>, default: Option<T>) -> Option<Result<T, Error>>
6where
7T: 'static + Clone
8{
9 let _next = iter.next();
10 if let Some(v_next) = _next {
11 match v_next {
12 Ok(ok_v_next) => {
13 return Some(Ok(ok_v_next.clone()));
14 },
15 Err(err_v_next) => {
16 return Some(Err(err_v_next));
17 }
18 }
19 } else {
20 if let Some(v_default) = default {
21 return Some(Ok(v_default.clone()));
22 } else {
23 return Some(Err(error::value_error(String::from("[first:empty iterable, and no default value]"))));
24 }
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use crate::utils::generate_okok_iterator;
31 use crate::utils::generate_okokerr_iterator;
32
33 use super::*;
34
35 #[test]
36 fn test1() {
37 let ret = first(&mut generate_okok_iterator(vec![2,3,4]), Some(5));
38 assert_eq!(2, ret.unwrap().ok().unwrap());
39
40 let ret2 = first(&mut generate_okok_iterator(vec![]), Some(5));
41 assert_eq!(5, ret2.unwrap().ok().unwrap());
42
43 let ret3 = first(&mut generate_okok_iterator(vec![]), None::<i32>);
44 assert_eq!(error::Kind::ValueError, ret3.unwrap().err().unwrap().kind());
45
46 let v = vec![1,2,3];
47 let ret4 = first(&mut generate_okok_iterator(v), Some(0));
48 assert_eq!(1, ret4.unwrap().ok().unwrap());
49
50 let ret5 = first(&mut generate_okokerr_iterator(vec![], error::overflow_error("for test".to_string())), Some(5));
51 assert_eq!(error::Kind::OverflowError, ret5.unwrap().err().unwrap().kind());
52 }
53}
54