playit_agent_core/utils/
non_overlapping.rs

1pub struct NonOverlapping<T> {
2    elements: Vec<T>,
3}
4
5impl<T> NonOverlapping<T> {
6    pub fn new() -> Self {
7        NonOverlapping {
8            elements: vec![],
9        }
10    }
11
12    pub fn with(elem: T) -> Self {
13        NonOverlapping {
14            elements: vec![elem],
15        }
16    }
17
18    pub fn add<C: NonOverlappingCheck<Element = T>>(&mut self, to_add: C::Element) -> Result<(), C::Element> {
19        for item in &self.elements {
20            if C::is_overlapping(&to_add, item) {
21                return Err(to_add);
22            }
23        }
24
25        self.elements.push(to_add);
26        Ok(())
27    }
28
29    pub fn remove<C: NonOverlappingCheck<Element = T>>(&mut self, item: &C::Element) -> bool {
30        let Some(pos) = self.elements.iter().position(|a| C::is_same(a, item)) else {
31            return false;
32        };
33
34        self.elements.swap_remove(pos);
35        true
36    }
37
38    pub fn contains<C: NonOverlappingCheck<Element = T>>(&self, item: &C::Element) -> bool {
39        self.elements.iter().position(|a| C::is_same(a, item)).is_some()
40    }
41
42    pub fn iter(&self) -> std::slice::Iter<T> {
43        self.elements.iter()
44    }
45}
46
47pub trait NonOverlappingCheck {
48    type Element;
49
50    fn is_same(a: &Self::Element, b: &Self::Element) -> bool;
51
52    fn is_overlapping(a: &Self::Element, b: &Self::Element) -> bool;
53}