Crates.io | microkelvin |
lib.rs | microkelvin |
version | 0.17.0 |
source | src |
created_at | 2020-10-20 14:03:39.491057 |
updated_at | 2022-10-19 12:43:54.565573 |
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.