1use ferroui_reactive::concurrency::IScheduler;
13use ferroui_system::IObservable;
14use std::hash::Hash;
15use std::rc::Rc;
16use std::time::Duration;
17
18pub type ExpireAfterSelector<T> = Rc<dyn Fn(&T) -> Option<Duration>>;
20
21pub trait ObservableItemsEx<T: Clone + 'static> {
24 fn item_sequence(&self) -> Rc<dyn IObservable<T>>;
26
27 fn to_observable_change_set(&self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
30 where
31 T: PartialEq,
32 {
33 crate::list::internal::to_observable_change_set_of_items(self.item_sequence(), None, None, None)
34 }
35
36 fn to_observable_change_set_with(
41 &self,
42 expire_after: Option<ExpireAfterSelector<T>>,
43 limit_size_to: Option<usize>,
44 scheduler: Option<Rc<dyn IScheduler>>,
45 ) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
46 where
47 T: PartialEq,
48 {
49 crate::list::internal::to_observable_change_set_of_items(self.item_sequence(), expire_after, limit_size_to, scheduler)
50 }
51
52 fn to_observable_change_set_cache<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
55 crate::cache::internal::to_observable_change_set_of_items(self.item_sequence(), Rc::new(key_selector), None, None, None)
56 }
57
58 fn to_observable_change_set_cache_with<K: Eq + Hash + Clone + 'static>(
63 &self,
64 key_selector: impl Fn(&T) -> K + 'static,
65 expire_after: Option<ExpireAfterSelector<T>>,
66 limit_size_to: Option<usize>,
67 scheduler: Option<Rc<dyn IScheduler>>,
68 ) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
69 crate::cache::internal::to_observable_change_set_of_items(self.item_sequence(), Rc::new(key_selector), expire_after, limit_size_to, scheduler)
70 }
71}
72
73impl<T: Clone + 'static> ObservableItemsEx<T> for Rc<dyn IObservable<T>> {
74 fn item_sequence(&self) -> Rc<dyn IObservable<T>> {
75 self.clone()
76 }
77}
78
79pub trait ObservableSequencesEx<T: Clone + 'static> {
83 fn to_observable_change_set_many(&self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
86 where
87 T: PartialEq;
88
89 fn to_observable_change_set_many_with(
92 &self,
93 expire_after: Option<ExpireAfterSelector<T>>,
94 limit_size_to: Option<usize>,
95 scheduler: Option<Rc<dyn IScheduler>>,
96 ) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
97 where
98 T: PartialEq;
99
100 fn to_observable_change_set_cache_many<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>;
103
104 fn to_observable_change_set_cache_many_with<K: Eq + Hash + Clone + 'static>(
107 &self,
108 key_selector: impl Fn(&T) -> K + 'static,
109 expire_after: Option<ExpireAfterSelector<T>>,
110 limit_size_to: Option<usize>,
111 scheduler: Option<Rc<dyn IScheduler>>,
112 ) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>;
113
114 fn edit_diff<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>
119 where
120 T: PartialEq;
121
122 fn edit_diff_with_comparer<K: Eq + Hash + Clone + 'static>(
124 &self,
125 key_selector: impl Fn(&T) -> K + 'static,
126 equality_comparer: impl Fn(&T, &T) -> bool + 'static,
127 ) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>;
128}
129
130impl<T: Clone + 'static, I: IntoIterator<Item = T> + 'static> ObservableSequencesEx<T> for Rc<dyn IObservable<I>> {
131 fn to_observable_change_set_many(&self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
132 where
133 T: PartialEq,
134 {
135 crate::list::internal::to_observable_change_set(self.clone(), None, None, None)
136 }
137
138 fn to_observable_change_set_many_with(
139 &self,
140 expire_after: Option<ExpireAfterSelector<T>>,
141 limit_size_to: Option<usize>,
142 scheduler: Option<Rc<dyn IScheduler>>,
143 ) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
144 where
145 T: PartialEq,
146 {
147 crate::list::internal::to_observable_change_set(self.clone(), expire_after, limit_size_to, scheduler)
148 }
149
150 fn to_observable_change_set_cache_many<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
151 crate::cache::internal::to_observable_change_set(self.clone(), Rc::new(key_selector), None, None, None)
152 }
153
154 fn to_observable_change_set_cache_many_with<K: Eq + Hash + Clone + 'static>(
155 &self,
156 key_selector: impl Fn(&T) -> K + 'static,
157 expire_after: Option<ExpireAfterSelector<T>>,
158 limit_size_to: Option<usize>,
159 scheduler: Option<Rc<dyn IScheduler>>,
160 ) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
161 crate::cache::internal::to_observable_change_set(self.clone(), Rc::new(key_selector), expire_after, limit_size_to, scheduler)
162 }
163
164 fn edit_diff<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>
165 where
166 T: PartialEq,
167 {
168 crate::cache::internal::edit_diff_change_set(self.clone(), Rc::new(key_selector), Rc::new(|a: &T, b: &T| a == b))
169 }
170
171 fn edit_diff_with_comparer<K: Eq + Hash + Clone + 'static>(
172 &self,
173 key_selector: impl Fn(&T) -> K + 'static,
174 equality_comparer: impl Fn(&T, &T) -> bool + 'static,
175 ) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
176 crate::cache::internal::edit_diff_change_set(self.clone(), Rc::new(key_selector), Rc::new(equality_comparer))
177 }
178}