Skip to main content

ferroui_dynamic_data/list/
range_change.rs

1//! `RangeChange<T>` (`List/RangeChange.cs`).
2
3/// The items of a change of a range, and the index of the first (`RangeChange<T>`).
4#[derive(Clone, Debug, PartialEq, Eq, Hash)]
5pub struct RangeChange<T> {
6    items: Vec<T>,
7    index: Option<usize>,
8}
9
10impl<T> Default for RangeChange<T> {
11    /// No items, no index (`RangeChange<T>.Empty`).
12    fn default() -> Self {
13        Self { items: Vec::new(), index: None }
14    }
15}
16
17impl<T> RangeChange<T> {
18    /// `RangeChange(IEnumerable<T>, int index = -1)`.
19    pub fn new(items: Vec<T>, index: Option<usize>) -> Self {
20        Self { items, index }
21    }
22
23    /// The number of items (`Count`).
24    pub fn count(&self) -> usize {
25        self.items.len()
26    }
27
28    /// The index of the first item (`Index`).
29    pub fn index(&self) -> Option<usize> {
30        self.index
31    }
32
33    /// The items.
34    pub fn items(&self) -> &[T] {
35        &self.items
36    }
37
38    pub fn iter(&self) -> std::slice::Iter<'_, T> {
39        self.items.iter()
40    }
41
42    /// Adds an item at the end (`Add`).
43    pub fn add(&mut self, item: T) {
44        self.items.push(item);
45    }
46
47    /// Inserts an item (`Insert`).
48    pub fn insert(&mut self, index: usize, item: T) {
49        self.items.insert(index, item);
50    }
51
52    /// Sets the index of the first item (`SetStartingIndex`).
53    pub fn set_starting_index(&mut self, index: Option<usize>) {
54        self.index = index;
55    }
56}
57
58impl<'a, T> IntoIterator for &'a RangeChange<T> {
59    type Item = &'a T;
60    type IntoIter = std::slice::Iter<'a, T>;
61
62    fn into_iter(self) -> Self::IntoIter {
63        self.items.iter()
64    }
65}