Skip to main content

ferroui_dynamic_data/list/ops/
flatten_buffer_result.rs

1//! `FlattenBufferResult` (`List/ObservableListEx.FlattenBufferResult.cs`): the operator of the
2//! sequences of buffers of change sets of lists.
3
4use crate::list::{ChangeSet, IChangeSet};
5use ferroui_reactive::ObservableExt;
6use ferroui_system::IObservable;
7use std::rc::Rc;
8
9/// The buffers of change sets, each as one change set; the empty buffers are left out
10/// (`FlattenBufferResult(IObservable<IList<IChangeSet<T>>>)`).
11pub fn flatten_buffer_result<T: Clone + 'static, C: IChangeSet<T>>(source: Rc<dyn IObservable<Vec<C>>>) -> Rc<dyn IObservable<ChangeSet<T>>> {
12    source
13        .where_(|buffer: &Vec<C>| !buffer.is_empty())
14        .select(|updates: Vec<C>| updates.iter().flat_map(|update| update.change_set().iter().cloned()).collect::<ChangeSet<T>>())
15}
16
17/// [`flatten_buffer_result`] as a method of the sequences of buffers of change sets of lists.
18pub trait FlattenBufferResultListEx<T> {
19    /// The buffers of change sets, each as one change set (`FlattenBufferResult`).
20    fn flatten_buffer_result(&self) -> Rc<dyn IObservable<ChangeSet<T>>>;
21}
22
23impl<T: Clone + 'static, C: IChangeSet<T>> FlattenBufferResultListEx<T> for Rc<dyn IObservable<Vec<C>>> {
24    fn flatten_buffer_result(&self) -> Rc<dyn IObservable<ChangeSet<T>>> {
25        flatten_buffer_result(self.clone())
26    }
27}