7 个版本
0.2.1 | 2021 年 7 月 27 日 |
---|---|
0.2.0 | 2021 年 7 月 27 日 |
0.1.4 | 2020 年 4 月 23 日 |
0.1.3 | 2019 年 6 月 3 日 |
0.1.0 | 2019 年 4 月 28 日 |
#1808 在 数据结构
每月 23 次下载
20KB
317 行
fplist
Rust 中的持久、不可变单链表。
持久性是数据结构在修改时的属性。持久性规定,在添加或删除元素时,结构的老版本始终被保留。这个 crate 以链表的形式提供了这样的结构。
为了在保持持久性的同时尽可能高效,链表使用了 引用计数。这允许在具有相同元素的列表之间共享内存。默认情况下,列表使用 Rc
类型来此目的。然而,Rc
的一大缺点是列表无法在线程之间传递。为此,您可能需要启用 multithreaded
功能,这将指示列表使用多线程的兄弟 Arc
。
持久性的一个内在要求是结构必须是不可变的。也就是说,它们不能允许其元素被修改。列表类型只为不可变和拥有其元素的访问提供了 API。您可以通过使用 RefCell
或 Mutex
类型来绕过这一点,这些类型授予内部可变性。
列表类型受到来自 Lisp 语言的 cons 列表 的启发,这也是列表类型是如何被构建和表示的。
Serde
列表能够通过 serde 框架 进行序列化或反序列化。然而,默认情况下,支持是禁用的(以避免不必要的依赖)。通过启用 serde_impls
功能来启用支持。
示例
use fplist::{PersistentList, cons};
let list = cons(1, cons(2, cons(3, PersistentList::new())));
assert_eq!(list.first(), Some(&1));
let list = list.rest();
assert_eq!(list.first(), Some(&2));
let list = list.rest();
assert_eq!(list.first(), Some(&3));
let list = list.rest();
assert_eq!(list.first(), None);
许可证
该项目受 MIT 许可证 的管辖。
依赖项
~170KB