ferroui_dynamic_data/cache/
sorted_change_set.rs1use super::{ChangeSet, IChangeSet, KeyValueCollection};
5use std::fmt;
6use std::ops::Deref;
7
8pub trait ISortedChangeSet<T, K>: IChangeSet<T, K> {
11 fn sorted_items(&self) -> &KeyValueCollection<T, K>;
13
14 fn to_sorted_change_set(&self) -> SortedChangeSet<T, K> {
16 SortedChangeSet::new(self.sorted_items().clone(), self.change_set().clone())
17 }
18}
19
20pub 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 pub fn new(sorted_items: KeyValueCollection<T, K>, updates: ChangeSet<T, K>) -> Self {
44 Self { changes: updates, sorted_items }
45 }
46
47 pub fn empty() -> Self {
49 Self::new(KeyValueCollection::empty(), ChangeSet::empty())
50 }
51
52 pub fn sorted_items(&self) -> &KeyValueCollection<T, K> {
54 &self.sorted_items
55 }
56
57 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 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 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}