This crate provides a data type GranularId<T>
that can represent ID numbers with arbitrary precision.
GranularId<T>
is a sequence of components of type T
that can be ordered and compared.GranularId<T>
s, there are infinitely many more granular IDs.GranularId<T>
is best used with any unsized integer type, such as u8
, u16
, u32
, etc.GranularId<T>
can also be used with any type that implements the appropriate num_traits
.GranularId<T>
has methods to access its parent, children, siblings, and other relations in a tree-like structure.```rust
// Create a new GranularId from a vec of u8 (id: 1.2.3)
let id: GranularId
// Get the parent ID (id: 1.2) let parent = id.parent(); assert_eq!(parent, vec![1, 2].into());
// Iterate over the following siblings of 1.2.3 let mut nextsiblings = id.nextsiblings(); // First one is 1.2.4 asserteq!(nextsiblings.next().unwrap(), vec![1, 2, 4].into()); // Then, 1.2.5, etc asserteq!(nextsiblings.next().unwrap(), vec![1, 2, 5].into()); asserteq!(nextsiblings.next().unwrap(), vec![1, 2, 6].into());
// Get an iterator over childrens of 1.2.3 let mut children = id.children(); // First one is 1.2.3.0 asserteq!(children.next().unwrap(), vec![1, 2, 3, 0].into()); // Then, 1.2.3.1, etc asserteq!(children.next().unwrap(), vec![1, 2, 3, 1].into()); assert_eq!(children.next().unwrap(), vec![1, 2, 3, 2].into());
// Each parent is always smaller than all of its children assert!(parent < id); ```
Add this to your Cargo.toml
:
toml
[dependencies]
granular-id = "0.2.0"
This project is licensed under the MIT license. See LICENSE for more details.