Skip to main content

ferroui_dynamic_data/cache/
paged_change_set.rs

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