1use crate::evt::Event;
2use crate::item::Name;
3
4pub mod u;
5
6pub fn get_next_simple_retry<N>(get_next: N, limit: usize) -> Event
7where
8 N: FnMut() -> Option<Result<Name, Event>>,
9{
10 let i = std::iter::from_fn(get_next);
11 let l = i.take(limit);
12 let mut f = l.flat_map(|r| r.ok());
13 f.next()
14 .map(Event::Empty)
15 .unwrap_or_else(|| Event::TooManyItemsAlready)
16}
17
18pub fn get_next_checked_new<N, E>(
19 mut get_next_unchecked: N,
20 is_empty: E,
21) -> impl FnMut() -> Result<Name, Event>
22where
23 N: FnMut() -> Result<Name, Event>,
24 E: Fn(&Name) -> Result<bool, Event>,
25{
26 move || {
27 let n: Name = get_next_unchecked()?;
28 match is_empty(&n) {
29 Ok(true) => Ok(n),
30 Err(Event::NoEntry(n)) => Ok(n),
31 Ok(false) => Err(Event::Used(n)),
32 Err(e) => Err(e),
33 }
34 }
35}
36
37#[cfg(test)]
38mod test_next {
39
40 mod get_next_simple_retry {
41
42 use crate::evt::Event;
43 use crate::item::Name;
44 use crate::next;
45
46 #[test]
47 fn test_empty_candidates() {
48 let get_next = || None;
49 let limit = 256;
50 let evt: Event = next::get_next_simple_retry(get_next, limit);
51 assert_eq!(evt, Event::TooManyItemsAlready);
52 }
53
54 #[test]
55 fn test_no_empty() {
56 let get_next = || Some(Err(Event::Used(Name::from(""))));
57 let limit = 256;
58 let evt: Event = next::get_next_simple_retry(get_next, limit);
59 assert_eq!(evt, Event::TooManyItemsAlready);
60 }
61
62 #[test]
63 fn test_empty1st() {
64 let get_next = || Some(Ok(Name::from("42")));
65 let limit = 256;
66 let evt: Event = next::get_next_simple_retry(get_next, limit);
67 assert_eq!(evt, Event::Empty(Name::from("42")));
68 }
69 }
70
71 mod get_next_checked_new {
72
73 use crate::evt::Event;
74 use crate::item::Name;
75 use crate::next;
76
77 #[test]
78 fn test_empty() {
79 let get_next_unchecked = || Ok(Name::from("42"));
80 let is_empty = |_: &Name| Ok(true);
81
82 let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
83 let n: Name = f().unwrap();
84 assert_eq!(n, Name::from("42"));
85 }
86
87 #[test]
88 fn test_noent() {
89 let get_next_unchecked = || Ok(Name::from(""));
90 let is_empty = |_: &Name| Err(Event::NoEntry(Name::from("42")));
91
92 let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
93 let n: Name = f().unwrap();
94 assert_eq!(n, Name::from("42"));
95 }
96
97 #[test]
98 fn test_used() {
99 let get_next_unchecked = || Ok(Name::from("42"));
100 let is_empty = |_: &Name| Ok(false);
101
102 let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
103 let r = f();
104 assert_eq!(r, Err(Event::Used(Name::from("42"))));
105 }
106
107 #[test]
108 fn test_unexpected() {
109 let get_next_unchecked = || Ok(Name::from(""));
110 let is_empty = |_: &Name| Err(Event::Broken(Name::from("42")));
111
112 let mut f = next::get_next_checked_new(get_next_unchecked, is_empty);
113 let r = f();
114 assert_eq!(r, Err(Event::Broken(Name::from("42"))));
115 }
116 }
117}