8 stable releases

1.0.7 Feb 16, 2024
1.0.6 Jun 11, 2020
1.0.5 Nov 21, 2019
1.0.4 Dec 18, 2018
0.1.0 Jul 31, 2017

#216 in Data structures

Download history 1551/week @ 2024-08-14 2227/week @ 2024-08-21 1698/week @ 2024-08-28 1500/week @ 2024-09-04 1235/week @ 2024-09-11 1502/week @ 2024-09-18 1475/week @ 2024-09-25 1427/week @ 2024-10-02 1681/week @ 2024-10-09 2044/week @ 2024-10-16 2124/week @ 2024-10-23 1881/week @ 2024-10-30 1890/week @ 2024-11-06 1875/week @ 2024-11-13 2088/week @ 2024-11-20 2198/week @ 2024-11-27

8,427 downloads per month
Used in 14 crates (3 directly)

Apache-2.0/MIT

16KB
234 lines

Cactus

This library provides an immutable cactus stack (also called a spaghetti stack or parent pointer tree). A cactus stack is a (possibly empty) node with a (possibly null) pointer to a parent node. Any given node has a unique path back to the root node. Rather than mutably updating the stack, one creates and obtains access to immutable nodes (when a node becomes unreachable its memory is automatically reclaimed). A new child node pointing to a parent can be created via the child function (analogous to the normal push) and a parent can be retrieved via the parent function (analogous to the normal pop).

use cactus::Cactus;
let c = Cactus::new();
assert!(c.is_empty());
let c2 = c.child(1);
assert_eq!(c2.len(), 1);
assert_eq!(*c2.val().unwrap(), 1);
let c3 = c2.parent().unwrap();
assert!(c3.is_empty());

From a given node one can create multiple sub-stacks:

use cactus::Cactus;
let c = Cactus::new().child(1);
let c2 = c.child(2);
let c3 = c.child(3);
assert!(c2 != c3);
assert_eq!(c2.vals().cloned().collect::<Vec<_>>(), [2, 1]);
assert_eq!(c3.vals().cloned().collect::<Vec<_>>(), [3, 1]);

No runtime deps