#text #crdt #versioned #structure #replicated #conflict-free

chronofold

无冲突的版本化文本数据结构(又称CRDT)

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次 下载

AGPL-3.0

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