use super::Cache;
use crate::cache::{ChangeSet, ICache};
use ferroui_reactive::ObservableExt;
use ferroui_system::IObservable;
use std::cell::RefCell;
use std::hash::Hash;
use std::rc::Rc;
pub(crate) struct ChangeSetCache<T, K> {
cache: Rc<RefCell<Cache<T, K>>>,
source: Rc<dyn IObservable<ChangeSet<T, K>>>,
}
impl<T: Clone + 'static, K: Eq + Hash + Clone + 'static> ChangeSetCache<T, K> {
pub(crate) fn new(source: Rc<dyn IObservable<ChangeSet<T, K>>>) -> Rc<Self> {
let cache = Rc::new(RefCell::new(Cache::new()));
let target = cache.clone();
let source = source.do_(move |changes: &ChangeSet<T, K>| target.borrow_mut().clone_changes(changes));
Rc::new(Self { cache, source })
}
pub(crate) fn cache(&self) -> std::cell::Ref<'_, Cache<T, K>> {
self.cache.borrow()
}
pub(crate) fn source(&self) -> Rc<dyn IObservable<ChangeSet<T, K>>> {
self.source.clone()
}
}