crdt-richtext 0.1.1

Richtext CRDT, Rust implementation of Peritext and Fugue
Documentation
use fxhash::FxHashMap;
use serde::{Deserialize, Serialize};
use serde_columnar::to_vec;

use crate::{ClientID, Counter};

#[derive(Default, Debug, Clone)]
pub struct VersionVector {
    pub(crate) vv: FxHashMap<ClientID, Counter>,
}

#[derive(Serialize, Clone, Copy, Deserialize)]
struct Item {
    client: ClientID,
    counter: Counter,
}

impl VersionVector {
    pub fn encode(&self) -> Vec<u8> {
        let v: Vec<Item> = self
            .vv
            .iter()
            .map(|x| Item {
                client: *x.0,
                counter: *x.1,
            })
            .collect();
        to_vec(&v).unwrap()
    }

    pub fn decode(data: &[u8]) -> VersionVector {
        let v: Vec<Item> = serde_columnar::from_bytes(data).unwrap();
        let mut vv = VersionVector::default();
        for item in v {
            vv.vv.insert(item.client, item.counter);
        }
        vv
    }
}