use ferroui_reactive::concurrency::IScheduler;
use ferroui_system::IObservable;
use std::hash::Hash;
use std::rc::Rc;
use std::time::Duration;
pub type ExpireAfterSelector<T> = Rc<dyn Fn(&T) -> Option<Duration>>;
pub trait ObservableItemsEx<T: Clone + 'static> {
fn item_sequence(&self) -> Rc<dyn IObservable<T>>;
fn to_observable_change_set(&self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
where
T: PartialEq,
{
crate::list::internal::to_observable_change_set_of_items(self.item_sequence(), None, None, None)
}
fn to_observable_change_set_with(
&self,
expire_after: Option<ExpireAfterSelector<T>>,
limit_size_to: Option<usize>,
scheduler: Option<Rc<dyn IScheduler>>,
) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
where
T: PartialEq,
{
crate::list::internal::to_observable_change_set_of_items(self.item_sequence(), expire_after, limit_size_to, scheduler)
}
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>>> {
crate::cache::internal::to_observable_change_set_of_items(self.item_sequence(), Rc::new(key_selector), None, None, None)
}
fn to_observable_change_set_cache_with<K: Eq + Hash + Clone + 'static>(
&self,
key_selector: impl Fn(&T) -> K + 'static,
expire_after: Option<ExpireAfterSelector<T>>,
limit_size_to: Option<usize>,
scheduler: Option<Rc<dyn IScheduler>>,
) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
crate::cache::internal::to_observable_change_set_of_items(self.item_sequence(), Rc::new(key_selector), expire_after, limit_size_to, scheduler)
}
}
impl<T: Clone + 'static> ObservableItemsEx<T> for Rc<dyn IObservable<T>> {
fn item_sequence(&self) -> Rc<dyn IObservable<T>> {
self.clone()
}
}
pub trait ObservableSequencesEx<T: Clone + 'static> {
fn to_observable_change_set_many(&self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
where
T: PartialEq;
fn to_observable_change_set_many_with(
&self,
expire_after: Option<ExpireAfterSelector<T>>,
limit_size_to: Option<usize>,
scheduler: Option<Rc<dyn IScheduler>>,
) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
where
T: PartialEq;
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>>>;
fn to_observable_change_set_cache_many_with<K: Eq + Hash + Clone + 'static>(
&self,
key_selector: impl Fn(&T) -> K + 'static,
expire_after: Option<ExpireAfterSelector<T>>,
limit_size_to: Option<usize>,
scheduler: Option<Rc<dyn IScheduler>>,
) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>;
fn edit_diff<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>
where
T: PartialEq;
fn edit_diff_with_comparer<K: Eq + Hash + Clone + 'static>(
&self,
key_selector: impl Fn(&T) -> K + 'static,
equality_comparer: impl Fn(&T, &T) -> bool + 'static,
) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>;
}
impl<T: Clone + 'static, I: IntoIterator<Item = T> + 'static> ObservableSequencesEx<T> for Rc<dyn IObservable<I>> {
fn to_observable_change_set_many(&self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
where
T: PartialEq,
{
crate::list::internal::to_observable_change_set(self.clone(), None, None, None)
}
fn to_observable_change_set_many_with(
&self,
expire_after: Option<ExpireAfterSelector<T>>,
limit_size_to: Option<usize>,
scheduler: Option<Rc<dyn IScheduler>>,
) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>>
where
T: PartialEq,
{
crate::list::internal::to_observable_change_set(self.clone(), expire_after, limit_size_to, scheduler)
}
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>>> {
crate::cache::internal::to_observable_change_set(self.clone(), Rc::new(key_selector), None, None, None)
}
fn to_observable_change_set_cache_many_with<K: Eq + Hash + Clone + 'static>(
&self,
key_selector: impl Fn(&T) -> K + 'static,
expire_after: Option<ExpireAfterSelector<T>>,
limit_size_to: Option<usize>,
scheduler: Option<Rc<dyn IScheduler>>,
) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
crate::cache::internal::to_observable_change_set(self.clone(), Rc::new(key_selector), expire_after, limit_size_to, scheduler)
}
fn edit_diff<K: Eq + Hash + Clone + 'static>(&self, key_selector: impl Fn(&T) -> K + 'static) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>>
where
T: PartialEq,
{
crate::cache::internal::edit_diff_change_set(self.clone(), Rc::new(key_selector), Rc::new(|a: &T, b: &T| a == b))
}
fn edit_diff_with_comparer<K: Eq + Hash + Clone + 'static>(
&self,
key_selector: impl Fn(&T) -> K + 'static,
equality_comparer: impl Fn(&T, &T) -> bool + 'static,
) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
crate::cache::internal::edit_diff_change_set(self.clone(), Rc::new(key_selector), Rc::new(equality_comparer))
}
}