use dioxus::prelude::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum Table {
Tracks = 0,
Albums = 1,
Playlists = 2,
Favorites = 3,
Folders = 4,
Servers = 5,
Recents = 6,
}
const N: usize = 7;
#[derive(Clone, Copy)]
pub struct Generations {
counters: [Signal<u64>; N],
dirty: Signal<[bool; N]>,
}
impl Generations {
pub fn bump(mut self, table: Table) {
*self.counters[table as usize].write() += 1;
}
pub fn bump_coalesced(mut self, table: Table) {
self.dirty.write()[table as usize] = true;
}
pub fn generation(self, table: Table) -> u64 {
(self.counters[table as usize])()
}
fn flush(mut self) {
let dirty = *self.dirty.peek();
if !dirty.iter().any(|&d| d) {
return;
}
for (i, &is_dirty) in dirty.iter().enumerate() {
if is_dirty {
*self.counters[i].write() += 1;
}
}
self.dirty.set([false; N]);
}
}
pub fn use_generations_provider() -> Generations {
let gens = Generations {
counters: [
use_signal(|| 0u64),
use_signal(|| 0u64),
use_signal(|| 0u64),
use_signal(|| 0u64),
use_signal(|| 0u64),
use_signal(|| 0u64),
use_signal(|| 0u64),
],
dirty: use_signal(|| [false; N]),
};
use_context_provider(|| gens);
use_future(move || async move {
loop {
utils::sleep(std::time::Duration::from_millis(150)).await;
gens.flush();
}
});
gens
}
pub fn use_generations() -> Generations {
use_context::<Generations>()
}