use super::{accumulate, AggregateChangeSets, AggregateNumber, AggregateValue};
use ferroui_system::IObservable;
use std::rc::Rc;
pub(crate) fn sum<T: 'static, V: AggregateValue>(source: AggregateChangeSets<T>, value_selector: impl Fn(&T) -> V + 'static) -> Rc<dyn IObservable<V::Number>> {
accumulate(
source,
<V::Number as AggregateNumber>::ZERO,
move |item: &T| value_selector(item).number(),
|current: V::Number, value: V::Number| current.plus(value),
|current: V::Number, value: V::Number| current.minus(value),
)
}