| Crates.io | microkelvin |
| lib.rs | microkelvin |
| version | 0.17.0 |
| created_at | 2020-10-20 14:03:39.491057+00 |
| updated_at | 2022-10-19 12:43:54.565573+00 |
| description | A crate for tree traversal over annotated data structures |
| homepage | |
| repository | https://github.com/dusk-network/microkelvin |
| max_upload_size | |
| id | 303493 |
| size | 61,517 |
Crate for creating and traversing recursively annotated structures.
/// A type that can recursively contain itself and leaves.
pub trait Compound<A>: Sized {
/// The leaf type of the compound collection
type Leaf;
/// Returns a reference to a possible child at specified index
fn child(&self, index: usize) -> Child<Self, A>;
/// Returns a mutable reference to a possible child at specified index
fn child_mut(&mut self, index: usize) -> ChildMut<Self, A>;
}
The Compound trait defines a type as a collection type. This means that it
can be searched and have branches constructed pointing to its elements.
The Walker trait can be implemented for walking the tree in a user defined
way. As an example, here's AllLeaves - an implementation used internally:
/// Walker that visits all leaves
pub struct AllLeaves;
impl<C, A> Walker<C, A> for AllLeaves
where
C: Compound<A>,
{
fn walk(&mut self, walk: Walk<C, A>) -> Step {
for i in 0.. {
match walk.child(i) {
Child::Leaf(_) => return Step::Found(i),
Child::Node(_) => return Step::Into(i),
Child::Empty => (),
Child::EndOfNode => return Step::Advance,
}
}
unreachable!()
}
}
Please check out the nstack implementation of a stack/vector type for a more advanced example.