ferroui_dynamic_data/list/ops/
merge_change_sets.rs1use crate::list::internal::merge_change_sets;
15use crate::list::ChangeSet;
16use ferroui_reactive::concurrency::IScheduler;
17use ferroui_system::IObservable;
18use std::rc::Rc;
19
20macro_rules! merge_change_sets_methods {
21 () => {
22 fn merge_change_sets(
27 &self,
28 other: std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>>,
29 ) -> std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>> {
30 crate::list::ops::merge_change_sets::merge_sources(vec![self.change_sets(), other], None, None, true)
31 }
32
33 fn merge_change_sets_with(
37 &self,
38 other: std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>>,
39 equality_comparer: Option<std::rc::Rc<dyn Fn(&T, &T) -> bool>>,
40 scheduler: Option<std::rc::Rc<dyn ferroui_reactive::concurrency::IScheduler>>,
41 completable: bool,
42 ) -> std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>> {
43 crate::list::ops::merge_change_sets::merge_sources(vec![self.change_sets(), other], equality_comparer, scheduler, completable)
44 }
45
46 fn merge_change_sets_many(
50 &self,
51 others: Vec<std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>>>,
52 ) -> std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>> {
53 let mut sources = vec![self.change_sets()];
54 sources.extend(others);
55 crate::list::ops::merge_change_sets::merge_sources(sources, None, None, true)
56 }
57
58 fn merge_change_sets_many_with(
60 &self,
61 others: Vec<std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>>>,
62 equality_comparer: Option<std::rc::Rc<dyn Fn(&T, &T) -> bool>>,
63 scheduler: Option<std::rc::Rc<dyn ferroui_reactive::concurrency::IScheduler>>,
64 completable: bool,
65 ) -> std::rc::Rc<dyn ferroui_system::IObservable<crate::list::ChangeSet<T>>> {
66 let mut sources = vec![self.change_sets()];
67 sources.extend(others);
68 crate::list::ops::merge_change_sets::merge_sources(sources, equality_comparer, scheduler, completable)
69 }
70 };
71}
72pub(crate) use merge_change_sets_methods;
73
74pub(crate) fn merge_sources<T: Clone + PartialEq + 'static>(
76 sources: Vec<Rc<dyn IObservable<ChangeSet<T>>>>,
77 equality_comparer: Option<Rc<dyn Fn(&T, &T) -> bool>>,
78 scheduler: Option<Rc<dyn IScheduler>>,
79 completable: bool,
80) -> Rc<dyn IObservable<ChangeSet<T>>> {
81 merge_change_sets(
82 crate::cache::internal::sources_observable(sources, completable, scheduler),
83 equality_comparer.unwrap_or_else(crate::cache::internal::default_equality_comparer),
84 )
85}
86
87pub trait ListChangeSetSourcesEx<T> {
92 fn merge_change_sets(&self) -> Rc<dyn IObservable<ChangeSet<T>>>;
94
95 fn merge_change_sets_with(
99 &self,
100 equality_comparer: Option<Rc<dyn Fn(&T, &T) -> bool>>,
101 scheduler: Option<Rc<dyn IScheduler>>,
102 completable: bool,
103 ) -> Rc<dyn IObservable<ChangeSet<T>>>;
104}
105
106impl<T: Clone + PartialEq + 'static> ListChangeSetSourcesEx<T> for [Rc<dyn IObservable<ChangeSet<T>>>] {
107 fn merge_change_sets(&self) -> Rc<dyn IObservable<ChangeSet<T>>> {
108 merge_sources(self.to_vec(), None, None, true)
109 }
110
111 fn merge_change_sets_with(
112 &self,
113 equality_comparer: Option<Rc<dyn Fn(&T, &T) -> bool>>,
114 scheduler: Option<Rc<dyn IScheduler>>,
115 completable: bool,
116 ) -> Rc<dyn IObservable<ChangeSet<T>>> {
117 merge_sources(self.to_vec(), equality_comparer, scheduler, completable)
118 }
119}
120
121pub trait ObservableListChangeSetsEx<T> {
125 fn merge_change_sets(&self) -> Rc<dyn IObservable<ChangeSet<T>>>;
127
128 fn merge_change_sets_with_comparer(&self, equality_comparer: impl Fn(&T, &T) -> bool + 'static) -> Rc<dyn IObservable<ChangeSet<T>>>;
130}
131
132impl<T: Clone + PartialEq + 'static> ObservableListChangeSetsEx<T> for Rc<dyn IObservable<Rc<dyn IObservable<ChangeSet<T>>>>> {
133 fn merge_change_sets(&self) -> Rc<dyn IObservable<ChangeSet<T>>> {
134 merge_change_sets(self.clone(), crate::cache::internal::default_equality_comparer())
135 }
136
137 fn merge_change_sets_with_comparer(&self, equality_comparer: impl Fn(&T, &T) -> bool + 'static) -> Rc<dyn IObservable<ChangeSet<T>>> {
138 merge_change_sets(self.clone(), Rc::new(equality_comparer))
139 }
140}