extern crate crdts;
use crdts::{CmRDT, CvRDT, Map, Orswot};
fn main() {
let mut friend_map: Map<&str, Orswot<&str, u8>, u8> = Map::new();
let read_ctx = friend_map.len(); friend_map.apply(
friend_map.update("bob", read_ctx.derive_add_ctx(1), |set, ctx| {
set.add("janet", ctx)
}),
);
let mut friend_map_on_2nd_device = friend_map.clone();
friend_map_on_2nd_device.apply(friend_map_on_2nd_device.update(
"bob",
friend_map_on_2nd_device.len().derive_add_ctx(2),
|set, c| set.add("erik", c),
));
friend_map.apply(friend_map.rm("bob", friend_map.get(&"bob").derive_rm_ctx()));
assert!(friend_map.get(&"bob").val.is_none());
let friend_map_snapshot = friend_map.clone();
let friend_map_on_2nd_device_snapshot = friend_map_on_2nd_device.clone();
friend_map.merge(friend_map_on_2nd_device_snapshot);
friend_map_on_2nd_device.merge(friend_map_snapshot);
assert_eq!(friend_map, friend_map_on_2nd_device);
let bobs_friends = friend_map
.get(&"bob")
.val
.map(|set| set.read().val)
.map(|hashmap| hashmap.into_iter().collect::<Vec<_>>());
assert_eq!(bobs_friends, Some(vec!["erik"]));
}