组合 CRDT
在 Loro 中,可以用 List、MovableList、Map、Tree 等基础 CRDT 搭建复杂数据结构。容器可以嵌套子容器,子容器又可继续嵌套,由此组合出多层结构。
需要注意:Loro 文档必须呈树形结构——父节点可以有多个子节点,但每个子节点只能有一个父节点,因此文档是树而不是图(例如 DAG)。
借助这些基础 CRDT,你可以有效建模符合 JSON schema 的文档状态与增量更新。
const = new ();
const = .("map");
let = 0;
// 子容器产生的事件会沿着父链向上传播。
.(() => {
.();
++;
});
// 为 map 创建子容器
// { map: { list: [] } }
const = .("list", new ());
.(0);
.(1);
// 为 list 创建子容器
// { map: { list: [0, 1, LoroText] } }
const = .(2, new ());
(.()).({ : { : [0, 1, ""] } });
{
// 提交时会触发事件,因为 list 是 map 的子容器
.();
await new (() => (, 1));
().(1);
}
.(0, "Hello, ");
.(7, "World!");
(.()).({ : { : [0, 1, "Hello, World!"] } });
{
// 提交时也会触发事件,因为 text 是 map 的后代容器
.();
await new (() => (, 1));
().(2);
}