aper 0.5.0

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

pub struct Atom<T: Serialize + DeserializeOwned + Default> {
    map: StoreHandle,
    _phantom: std::marker::PhantomData<T>,
}

impl<T: Serialize + DeserializeOwned + Default> AperSync for Atom<T> {
    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<T: Serialize + DeserializeOwned + Default> Atom<T> {
    pub fn get(&self) -> T {
        self.map
            .get(&vec![])
            .map(|bytes| bincode::deserialize(&bytes).expect("Couldn't deserialize"))
            .unwrap_or_default()
    }

    pub fn set(&mut self, value: T) {
        self.map.set(vec![], bincode::serialize(&value).unwrap());
    }
}