Skip to main content

deorbit_core/
mbmany.rs

1use std::slice;
2
3#[derive(Debug)]
4pub enum OneOrMany<T> {
5    One(T),
6    Many(Vec<T>),
7}
8
9impl<T> FromIterator<T> for OneOrMany<T> {
10    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
11        let mut iter = iter.into_iter();
12
13        let first = iter.next().expect("OneOrMany requires at least one element");
14
15        match iter.next() {
16            None => OneOrMany::One(first),
17
18            Some(second) => {
19                let mut v = vec![first, second];
20                v.extend(iter);
21                OneOrMany::Many(v)
22            }
23        }
24    }
25}
26
27impl<'a, T> IntoIterator for &'a OneOrMany<T> {
28    type Item = &'a T;
29    type IntoIter = slice::Iter<'a, T>;
30
31    fn into_iter(self) -> Self::IntoIter {
32        match self {
33            OneOrMany::One(x) => slice::from_ref(x).iter(),
34            OneOrMany::Many(x) => x.into_iter()
35        }
36    }
37}
38
39impl<T> OneOrMany<T> {
40    pub fn from_vec(mut vec: Vec<T>) -> Option<Self> {
41        match vec.len() {
42            x if x > 1 => Some(Self::Many(vec)),
43            1 => Some(Self::One(vec.remove(0))),
44            _ => None,
45        }
46    }
47
48    pub fn from_val(val: T) -> Self {
49        OneOrMany::One(val)
50    }
51
52    pub fn to_first_or_one(self) -> T {
53        match self {
54            OneOrMany::One(x) => x,
55            OneOrMany::Many(mut x) => x.remove(0),
56        }
57    }
58
59    pub fn to_last_or_one(self) -> T {
60        match self {
61            OneOrMany::One(x) => x,
62            OneOrMany::Many(mut x) => x.remove(x.len() - 1),
63        }
64    }
65}