1#[macro_export]
2macro_rules! range {
3 ($x: expr, $y: expr, $t: ident) => {{
4 let ret: Box<dyn Iterator<Item = $t>>;
5 if $y < $x {
6 ret = Box::new(($y..=$x).rev())
7 } else {
8 ret = Box::new($x..=$y)
9 }
10
11 ret
12 }};
13}
14
15#[cfg(test)]
16mod test {
17 use super::*;
18
19 #[test]
20 fn positive_range() {
21 let mut range = range!(1, 3, u32);
22
23 assert_eq!(range.next(), Some(1));
24 assert_eq!(range.next(), Some(2));
25 assert_eq!(range.next(), Some(3));
26 assert_eq!(range.next(), None);
27 }
28
29 #[test]
30 fn negative_range() {
31 let mut range = range!(3, 1, u32);
32
33 assert_eq!(range.next(), Some(3));
34 assert_eq!(range.next(), Some(2));
35 assert_eq!(range.next(), Some(1));
36 assert_eq!(range.next(), None);
37 }
38}