omni/
lib.rs

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}