use ferroui_reactive::disposables::Disposable;
use ferroui_reactive::Observable;
use ferroui_system::{IObservable, IObserver};
use std::hash::Hash;
use std::rc::Rc;
pub trait EnumerableEx<T: Clone + 'static>: IntoIterator<Item = T> + Sized {
fn as_observable_change_set(self) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>> {
self.as_observable_change_set_with(false)
}
fn as_observable_change_set_with(self, completable: bool) -> Rc<dyn IObservable<crate::list::ChangeSet<T>>> {
let items: Vec<T> = self.into_iter().collect();
Observable::create(move |observer: Rc<dyn IObserver<crate::list::ChangeSet<T>>>| {
let changes: Vec<crate::list::Change<T>> = items.iter().map(|item| crate::list::Change::new(crate::list::ListChangeReason::Add, item.clone(), None)).collect();
observer.on_next(crate::list::ChangeSet::from(changes));
if completable {
observer.on_completed();
}
Disposable::empty()
})
}
fn as_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>>> {
self.as_observable_change_set_cache_with(key_selector, false)
}
fn as_observable_change_set_cache_with<K: Eq + Hash + Clone + 'static>(self, key_selector: impl Fn(&T) -> K + 'static, completable: bool) -> Rc<dyn IObservable<crate::cache::ChangeSet<T, K>>> {
let items: Vec<T> = self.into_iter().collect();
Observable::create(move |observer: Rc<dyn IObserver<crate::cache::ChangeSet<T, K>>>| {
let changes: crate::cache::ChangeSet<T, K> = items.iter().map(|item| crate::cache::Change::new(crate::cache::ChangeReason::Add, key_selector(item), item.clone())).collect();
observer.on_next(changes);
if completable {
observer.on_completed();
}
Disposable::empty()
})
}
}
impl<T: Clone + 'static, I: IntoIterator<Item = T>> EnumerableEx<T> for I {}