aper 0.5.0

Synchronized state machines over WebSockets
Documentation
use crate::{AperSync, StoreHandle};
use serde::{de::DeserializeOwned, Serialize};

pub struct Map<K: Serialize + DeserializeOwned, V: AperSync> {
    map: StoreHandle,
    _phantom: std::marker::PhantomData<(K, V)>,
}

impl<K: Serialize + DeserializeOwned, V: AperSync> AperSync for Map<K, V> {
    fn attach(map: StoreHandle) -> Self {
        Self {
            map,
            _phantom: std::marker::PhantomData,
        }
    }

    fn listen<F: Fn() -> bool + 'static + Send + Sync>(&self, listener: F) {
        self.map.listen(listener)
    }
}

impl<K: Serialize + DeserializeOwned, V: AperSync> Map<K, V> {
    pub fn get(&mut self, key: &K) -> Option<V> {
        let key = bincode::serialize(key).unwrap();
        Some(V::attach(self.map.child(&key)))
    }

    pub fn get_or_create(&mut self, key: &K) -> V {
        let key = bincode::serialize(key).unwrap();
        V::attach(self.map.child(&key))
    }

    pub fn delete(&mut self, key: &K) {
        let key = bincode::serialize(key).unwrap();
        self.map.delete_child(&key);
    }
}