Skip to main content

autoagents_core/
one_or_many.rs

1use serde::{Deserialize, Serialize};
2
3/// Stores either a single item or multiple items without forcing a Vec allocation.
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub enum OneOrMany<T> {
6    One(T),
7    Many(Vec<T>),
8}
9
10impl<T> OneOrMany<T> {
11    pub fn len(&self) -> usize {
12        match self {
13            OneOrMany::One(_) => 1,
14            OneOrMany::Many(items) => items.len(),
15        }
16    }
17
18    pub fn is_empty(&self) -> bool {
19        self.len() == 0
20    }
21
22    pub fn iter(&self) -> Box<dyn Iterator<Item = &T> + '_> {
23        match self {
24            OneOrMany::One(item) => Box::new(std::iter::once(item)),
25            OneOrMany::Many(items) => Box::new(items.iter()),
26        }
27    }
28
29    pub fn into_vec(self) -> Vec<T> {
30        match self {
31            OneOrMany::One(item) => vec![item],
32            OneOrMany::Many(items) => items,
33        }
34    }
35
36    pub fn map<U, F>(self, mut f: F) -> OneOrMany<U>
37    where
38        F: FnMut(T) -> U,
39    {
40        match self {
41            OneOrMany::One(item) => OneOrMany::One(f(item)),
42            OneOrMany::Many(items) => OneOrMany::Many(items.into_iter().map(f).collect()),
43        }
44    }
45}
46
47impl<T> From<Vec<T>> for OneOrMany<T> {
48    fn from(value: Vec<T>) -> Self {
49        if value.len() == 1 {
50            OneOrMany::One(value.into_iter().next().unwrap())
51        } else {
52            OneOrMany::Many(value)
53        }
54    }
55}