pub fn walk_tree<S, B, I>(root: S, children_of: B) -> WalkTree<S, B>where
    S: Send,
    B: Fn(&S) -> I + Send + Sync,
    I: IntoIterator<Item = S>,
    I::IntoIter: DoubleEndedIterator,
Expand description

Create a tree like parallel iterator from an initial root node. The children_of function should take a node and iterate on all of its child nodes. The best parallelization is obtained when the tree is balanced but we should also be able to handle harder cases.

Ordering

This function does not guarantee any ordering but will use whatever algorithm is thought to achieve the fastest traversal. See also walk_tree_prefix which guarantees a prefix order and walk_tree_postfix which guarantees a postfix order.

Example

     4
    / \
   /   \
  2     3
       / \
      1   2
use rayon::iter::walk_tree;
use rayon::prelude::*;

let par_iter = walk_tree(4, |&e| {
    if e <= 2 {
        Vec::new()
    } else {
        vec![e / 2, e / 2 + 1]
    }
});
assert_eq!(par_iter.sum::<u32>(), 12);