amethystate 0.9.1

Type-safe reactive persistence for Rust GUI apps
Documentation
use crate::store::{StoreEvent, SubscriptionEntry, matches_kind};
use parking_lot::RwLock;

pub fn emit_events(subs_lock: &RwLock<Vec<SubscriptionEntry>>, event: StoreEvent) {
    let callbacks = {
        let guard = subs_lock.read();
        guard
            .iter()
            .filter(|s| matches_kind(&s.kind, &event.path))
            .map(|s| s.callback.clone())
            .collect::<Vec<_>>()
    };
    for cb in callbacks {
        cb(&event);
    }
}

#[cfg(any(feature = "sqlite", feature = "redb"))]
pub fn drain_pending_prefix(
    pending: &mut std::collections::HashMap<std::sync::Arc<str>, Option<Vec<u8>>>,
    prefix: &str,
) -> std::collections::HashMap<std::sync::Arc<str>, Option<Vec<u8>>> {
    use std::collections::HashMap;
    use std::sync::Arc;

    if pending.is_empty() {
        return HashMap::new();
    }

    if prefix.is_empty() {
        std::mem::take(pending)
    } else {
        let prefix_dot = format!("{}.", prefix);
        let keys_to_remove: Vec<Arc<str>> = pending
            .keys()
            .filter(|k| k.starts_with(&prefix_dot) || &***k == prefix)
            .cloned()
            .collect();

        let mut matched = HashMap::with_capacity(keys_to_remove.len());
        for k in keys_to_remove {
            if let Some(v) = pending.remove(&k) {
                matched.insert(k, v);
            }
        }
        matched
    }
}