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

MIT 许可证

20KB
317

fplist

Rust 中的持久、不可变单链表。

持久性是数据结构在修改时的属性。持久性规定,在添加或删除元素时,结构的老版本始终被保留。这个 crate 以链表的形式提供了这样的结构。

为了在保持持久性的同时尽可能高效,链表使用了 引用计数。这允许在具有相同元素的列表之间共享内存。默认情况下,列表使用 Rc 类型来此目的。然而,Rc 的一大缺点是列表无法在线程之间传递。为此,您可能需要启用 multithreaded 功能,这将指示列表使用多线程的兄弟 Arc

持久性的一个内在要求是结构必须是不可变的。也就是说,它们不能允许其元素被修改。列表类型只为不可变和拥有其元素的访问提供了 API。您可以通过使用 RefCellMutex 类型来绕过这一点,这些类型授予内部可变性。

列表类型受到来自 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