hedel-rs
A Rust Hierarchical Doubly Linked List
hedel-rs provides all you need to create your own abstraction over a
hierarchical doubly linked list in Rust, suitable choice for a DOM tree.
Designed for when you need a nested generation of nodes. ( e.g with macros node!(1, node!(2)) )
Based on Rc, Weak, and a safe wrapper around UnsafeCell (HedelCell).
If you are new to linked lists, consider reading Learn Rust With Entirely Too Many Linked Lists
Ideology
hedel isn't exactly a tree structure.
NodeListis a wrap around its first node. There isn't any root. This allows for sibling nodes at the root-level while keeping a different treatment compared toNode.- Given any node in the linked lists you should be able to navigate it all.
Nodeis simply a wrap on anRcpointer toHedelCell<NodeInner<T>>, which contains the actual data in thecontentfield.- Every
Nodehas achildfield which is the first child, allowing you to move vertically. - Support for node generation by defining the inner nodes first and the outer later. This means you can use the node!() macro and nest as many nodes as you want.
Features
-
HedelCell: a cell structure safely relying on UnsafeCell, similar toRefCellbut smaller in size. -
Node/WeakNode: to avoid memory-leaking we also provide a weak version ofNode. -
Macros: generate nodes blazingly fast with node!() and list!()
let node = node!; let my_node = node!; let my_list = list!; -
Identify and compare: create your own identifier implementing the
CompareNodetrait. -
Collect: iterate over the linked list and collect only the nodes matching the identifier.
let node = node!; let collection = node.collect_children; for node in collection.into_iter -
Detach: detach the nodes matching an identifier in the linked list.
let node = node!; let three = node.find_child.unwrap; three.detach; assert_eq!; -
Insert or Append: insert a node at any position in a linked list.
let node = node!; node.insert_child; assert_eq!; node.append_child; assert_eq!;