rust-scraper / ego-tree

Vec-backed ID-tree
https://docs.rs/ego-tree
ISC License
45 stars 16 forks source link

Ego Tree

crates.io downloads test

ego-tree is a Rust crate that provides a Vec-backed ID-tree implementation. It offers a flexible and efficient way to create and manipulate tree structures in Rust, with a focus on performance and ease of use.

ego-tree is on Crates.io and GitHub.

Design Philosophy

The design of ego-tree is centered around the following principles:

  1. Efficiency: The tree structure is backed by a Vec, allowing for fast, cache-friendly operations and efficient memory usage.

  2. Flexibility: Nodes can have any number of children, allowing for the representation of various tree structures.

  3. Stability: Node references remain valid even after modifying the tree structure, thanks to the use of stable NodeId indices.

  4. Safety: The API is designed to prevent common errors, such as creating cycles or detaching the root node.

  5. Ergonomics: The crate provides both low-level operations and high-level conveniences like the tree! macro for easy tree construction.

Key Design Choices

Vec-Backed Structure

Unlike traditional pointer-based trees, ego-tree uses a Vec to store all nodes. This design choice offers several advantages:

Node IDs

Nodes are identified by NodeIds, which are wrappers around indices into the underlying Vec. This approach allows for:

Immutable and Mutable Node References

The crate provides both NodeRef (immutable) and NodeMut (mutable) types for working with nodes. This separation allows for:

Orphan Nodes

Nodes can be detached from the tree but not removed entirely. This design choice:

Rich Iterator Support

The crate provides a variety of iterator types for traversing the tree in different ways. This design:

Use Cases

ego-tree is well-suited for applications that require:

Some potential use cases include:

Getting Started

Add this to your Cargo.toml:

[dependencies]
ego-tree = "0.6.2"

Basic usage:

use ego_tree::Tree;

let mut tree = Tree::new(1);
let mut root = tree.root_mut();
root.append(2);
let mut child = root.append(3);
child.append(4);
child.append(5);

For more detailed usage examples and API documentation, please refer to the documentation.

License

This project is licensed under the ISC License.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Credits

ego-tree is created and maintained by the team of rust-scraper.