Skip to main content

ferroui_dynamic_data/cache/ops/
flatten_buffer_result.rs

1//! `FlattenBufferResult` (`Cache/ObservableCacheEx.FlattenBufferResult.cs`): the operator of the
2//! sequences of buffers of change sets, which `Buffer` makes.
3
4use crate::cache::{ChangeSet, IChangeSet};
5use ferroui_reactive::ObservableExt;
6use ferroui_system::IObservable;
7use std::hash::Hash;
8use std::rc::Rc;
9
10/// The buffers of change sets, each as one change set; the empty buffers are left out
11/// (`FlattenBufferResult(IObservable<IList<IChangeSet<TObject, TKey>>>)`).
12pub 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
18/// [`flatten_buffer_result`] as a method of the sequences of buffers of change sets of caches.
19pub trait FlattenBufferResultCacheEx<T, K> {
20    /// The buffers of change sets, each as one change set (`FlattenBufferResult`).
21    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}