qptrie 0.2.1

A QP-Trie implementation for Rust
Documentation
use node::Node;
use ::Trie;

#[derive(Clone, Debug)]
pub struct TriePrefixIterator<'t, TK: 't + PartialEq + AsRef<[u8]>, TV: 't> {
    trie: &'t Trie<TK, TV>,
    prefix: &'t TK,
    todo: Vec<&'t Node<TK, TV>>,
    include_prefix: bool,
}

impl<'t, TK: 't + PartialEq + AsRef<[u8]>, TV: 't> TriePrefixIterator<'t, TK, TV> {
    pub fn new(trie: &'t Trie<TK, TV>, key: &'t TK, include_prefix: bool) -> Self {
        let todo = match trie.root() {
            None => vec![],
            Some(root) => vec![root],
        };
        TriePrefixIterator {
            trie: trie,
            prefix: key,
            todo: todo,
            include_prefix: include_prefix,
        }
    }
}

impl<'t, TK: PartialEq + AsRef<[u8]>, TV> TriePrefixIterator<'t, TK, TV> {
    #[inline]
    pub fn include_prefix(mut self) -> Self {
        self.include_prefix = true;
        self
    }
}

impl<'t, TK: PartialEq + AsRef<[u8]>, TV> Iterator for TriePrefixIterator<'t, TK, TV> {
    type Item = (&'t TK, &'t TV);

    fn next(&mut self) -> Option<Self::Item> {
        match self.trie.prefix_find_next(self.prefix, &mut self.todo, self.include_prefix) {
            None => None,
            Some(leaf) => {
                self.include_prefix = false;
                Some((&leaf.key, &leaf.val))
            }
        }
    }
}