ferroui_dynamic_data/cache/ops/
flatten_buffer_result.rs1use crate::cache::{ChangeSet, IChangeSet};
5use ferroui_reactive::ObservableExt;
6use ferroui_system::IObservable;
7use std::hash::Hash;
8use std::rc::Rc;
9
10pub fn flatten_buffer_result<T: Clone + 'static, K: Clone + 'static, C: IChangeSet<T, K>>(source: Rc<dyn IObservable<Vec<C>>>) -> Rc<dyn IObservable<ChangeSet<T, K>>> {
13 source
14 .where_(|buffer: &Vec<C>| !buffer.is_empty())
15 .select(|updates: Vec<C>| updates.iter().flat_map(|update| update.change_set().iter().cloned()).collect::<ChangeSet<T, K>>())
16}
17
18pub trait FlattenBufferResultCacheEx<T, K> {
20 fn flatten_buffer_result(&self) -> Rc<dyn IObservable<ChangeSet<T, K>>>;
22}
23
24impl<T: Clone + 'static, K: Eq + Hash + Clone + 'static, C: IChangeSet<T, K>> FlattenBufferResultCacheEx<T, K> for Rc<dyn IObservable<Vec<C>>> {
25 fn flatten_buffer_result(&self) -> Rc<dyn IObservable<ChangeSet<T, K>>> {
26 flatten_buffer_result(self.clone())
27 }
28}