#列表 #持久化 #不可变 #线程安全

persistent-list

单链表持久化线程安全列表

1个不稳定版本

0.1.0 2020年11月9日

#2400数据结构

MIT/Apache

40KB
618

persistent-list

单链表持久化线程安全列表

List 是一个基本单链表,它使用结构共享和 [Arc] + 写时复制 机制来提供一个持久化线程安全列表。

由于结构仅在需要时才被克隆,所以在没有结构共享的情况下,开销相对较小。

不可变性

纯主义者可能永远不会称这个结构为不可变,因为有许多提供修改底层数据的方式。然而,从Rust严格的可变性和借用机制来看,这个crate提供了一种具有持久数据结构的方法,它可以共享底层内存/状态,同时对所有人来说仍然看起来是不可变的。即使某个地方有实例被声明为可变的并开始修改其视图。

im crate 中汲取了许多灵感。它值得一看,因为它不仅提供了一些关于何时以及为什么使用这些类型结构的好动机,而且还提供了一些最重要的结构共享持久数据结构(Map、Set和Vector,使用HAMTRRB树B树)的优秀实现。

示例

// list1 and list2 structurally share the data
let list1 = list![1,2,3,4];
let mut list2 = list1.clone();

// they still share a tail even if one starts
// to be modified.
assert_eq!(list2.pop_front(), Some(1));

// Every time around the loop they share less and
// less data
for i in &mut list2 {
    *i *= 2;
}

// Until finally no structural sharing is possible
assert_eq!(list1, list![1,2,3,4]); // unchanged
assert_eq!(list2, list![4,6,8]);   // modified

当前版本:0.1.0

待办事项

这几乎是我写的第一个Rust项目,所以我认为有很多可以改进的地方。

除了我不可避免地犯的所有错误之外,还有一些肯定可以改进所有功能测试的地方。

特别是引入一些模糊测试或属性测试框架将使其大幅改进。

版权所有 2020 Axel Boldt-Christmas

许可:MIT OR Apache-2.0

无运行时依赖