Skip to main content

ferroui_dynamic_data/cache/
sorted_change_set.rs

1//! `ISortedChangeSet<TObject, TKey>` and `SortedChangeSet<TObject, TKey>`
2//! (`Cache/ISortedChangeSet.cs`, `Cache/SortedChangeSet.cs`).
3
4use super::{ChangeSet, IChangeSet, KeyValueCollection};
5use std::fmt;
6use std::ops::Deref;
7
8/// A change set with the sorted items it leads to (`ISortedChangeSet<TObject, TKey>`): the sorted
9/// change set, and the paged and virtual ones, which are sorted too.
10pub trait ISortedChangeSet<T, K>: IChangeSet<T, K> {
11    /// The items, sorted (`SortedItems`).
12    fn sorted_items(&self) -> &KeyValueCollection<T, K>;
13
14    /// The change set as a plain sorted one (the upcast to `ISortedChangeSet<TObject, TKey>`).
15    fn to_sorted_change_set(&self) -> SortedChangeSet<T, K> {
16        SortedChangeSet::new(self.sorted_items().clone(), self.change_set().clone())
17    }
18}
19
20/// The changes of a sorted cache with its items in order (`SortedChangeSet<TObject, TKey>`).
21///
22/// It dereferences to its [`ChangeSet`], as upstream's derives from it.
23pub struct SortedChangeSet<T, K> {
24    changes: ChangeSet<T, K>,
25    sorted_items: KeyValueCollection<T, K>,
26}
27
28impl<T, K> Clone for SortedChangeSet<T, K> {
29    fn clone(&self) -> Self {
30        Self { changes: self.changes.clone(), sorted_items: self.sorted_items.clone() }
31    }
32}
33
34impl<T, K> Default for SortedChangeSet<T, K> {
35    fn default() -> Self {
36        Self::empty()
37    }
38}
39
40impl<T, K> SortedChangeSet<T, K> {
41    /// The changes `updates` that lead to `sorted_items` (`SortedChangeSet(IKeyValueCollection,
42    /// IEnumerable<Change>)`).
43    pub fn new(sorted_items: KeyValueCollection<T, K>, updates: ChangeSet<T, K>) -> Self {
44        Self { changes: updates, sorted_items }
45    }
46
47    /// A change set without changes or items (`SortedChangeSet<TObject, TKey>.Empty`).
48    pub fn empty() -> Self {
49        Self::new(KeyValueCollection::empty(), ChangeSet::empty())
50    }
51
52    /// The items, sorted (`SortedItems`).
53    pub fn sorted_items(&self) -> &KeyValueCollection<T, K> {
54        &self.sorted_items
55    }
56
57    /// The changes.
58    pub fn changes(&self) -> &ChangeSet<T, K> {
59        &self.changes
60    }
61}
62
63impl<T, K> Deref for SortedChangeSet<T, K> {
64    type Target = ChangeSet<T, K>;
65
66    fn deref(&self) -> &Self::Target {
67        &self.changes
68    }
69}
70
71impl<'a, T, K> IntoIterator for &'a SortedChangeSet<T, K> {
72    type Item = &'a super::Change<T, K>;
73    type IntoIter = std::slice::Iter<'a, super::Change<T, K>>;
74
75    fn into_iter(self) -> Self::IntoIter {
76        self.changes.changes().iter()
77    }
78}
79
80impl<T: 'static, K: 'static> IChangeSet<T, K> for SortedChangeSet<T, K> {
81    fn change_set(&self) -> &ChangeSet<T, K> {
82        &self.changes
83    }
84}
85
86impl<T: 'static, K: 'static> ISortedChangeSet<T, K> for SortedChangeSet<T, K> {
87    fn sorted_items(&self) -> &KeyValueCollection<T, K> {
88        &self.sorted_items
89    }
90
91    fn to_sorted_change_set(&self) -> SortedChangeSet<T, K> {
92        self.clone()
93    }
94}
95
96impl<T: PartialEq, K: PartialEq> PartialEq for SortedChangeSet<T, K> {
97    /// The same sorted items (`Equals`: `SortedItems.SequenceEqual(other.SortedItems)`).
98    fn eq(&self, other: &Self) -> bool {
99        self.sorted_items == other.sorted_items
100    }
101}
102
103impl<T, K> fmt::Display for SortedChangeSet<T, K> {
104    /// `ToString`.
105    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
106        write!(f, "SortedChangeSet. Count= {}. Updates = {}", self.sorted_items.count(), self.changes.count())
107    }
108}
109
110impl<T: fmt::Debug, K: fmt::Debug> fmt::Debug for SortedChangeSet<T, K> {
111    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
112        f.debug_struct("SortedChangeSet").field("changes", &self.changes).field("sorted_items", &self.sorted_items).finish()
113    }
114}