5个版本 (3个重大更改)
0.4.0 | 2021年8月20日 |
---|---|
0.3.0 | 2021年8月7日 |
0.2.1 | 2021年8月2日 |
0.2.0 | 2020年9月18日 |
0.1.0 | 2020年5月13日 |
#676 in 数据结构
每月24次 下载
54KB
1K SLoC
Chronofold
Chronofold是一个无冲突的版本化文本数据结构(也称为CRDT)。
此crate旨在提供一个具有易于使用的类似Vec
API的快速实现。应该几乎不可能因为操作失误而导致数据损坏或丢失。
注意:我们还没有到达那里!虽然此实现应该是正确的,但它尚未针对速度和内存使用进行优化。随着我们继续探索不同的用例,API可能还会发生变化。
此实现基于Victor Grishchenko和Mikhail Patrakeev发表在"Chronofold: a data structure for versioned text"上的论文中的想法。如果您想了解什么是Chronofold的正式介绍,强烈建议您阅读这篇出色的论文!
示例用法
use chronofold::{Chronofold, LogIndex, Op};
type AuthorId = &'static str;
// Alice creates a chronofold on her machine, makes some initial changes
// and sends a copy to Bob.
let mut cfold_a = Chronofold::<AuthorId, char>::default();
cfold_a.session("alice").extend("Hello chronfold!".chars());
let mut cfold_b = cfold_a.clone();
// Alice adds some more text, ...
let ops_a: Vec<Op<AuthorId, char>> = {
let mut session = cfold_a.session("alice");
session.splice(
LogIndex(16)..LogIndex(16),
" - a data structure for versioned text".chars(),
);
session.iter_ops().map(Op::cloned).collect()
};
// ... while Bob fixes a typo.
let ops_b: Vec<Op<AuthorId, char>> = {
let mut session = cfold_b.session("bob");
session.insert_after(LogIndex(11), 'o');
session.iter_ops().map(Op::cloned).collect()
};
// Now their respective states have diverged.
assert_eq!(
"Hello chronfold - a data structure for versioned text!",
format!("{}", cfold_a),
);
assert_eq!("Hello chronofold!", format!("{}", cfold_b));
// As soon as both have seen all ops, their states have converged.
for op in ops_a {
cfold_b.apply(op).unwrap();
}
for op in ops_b {
cfold_a.apply(op).unwrap();
}
let final_text = "Hello chronofold - a data structure for versioned text!";
assert_eq!(final_text, format!("{}", cfold_a));
assert_eq!(final_text, format!("{}", cfold_b));
路线图
1.0 - 最小化首次发布
- API设计良好且被认为是稳定的
- 良好的测试覆盖率
- 数据结构的内部表示尚不重要
- 没有优化
依赖关系
~170KB