[−][src]Function traversal::dft_cycles
pub fn dft_cycles<'a, T, F, I>(
root: &'a T,
iter_children: F
) -> DftCycles<'a, T, F, I> where
T: ?Sized,
F: FnMut(&'a T) -> I,
I: Iterator<Item = &'a T>,
T: Eq + Hash,
This is a shorthand for DftCycles::new
, see DftCycles
for more information.
Example
#[derive(PartialEq, Eq, Hash)] struct Vertex(&'static str, Vec<usize>); // A <-+ // /|\ | // B | C | // \|/ | // D >-+ // // Cycles: // - A -> B -> D -> A // - A -> D -> A // - A -> C -> D -> A let graph = vec![ Vertex("A", vec![1, 3, 2]), // 0 Vertex("B", vec![3]), // 1 Vertex("C", vec![3]), // 2 Vertex("D", vec![0]), // 3 ]; let start = &graph[0]; // A // `&tree` represents the root `Vertex`. // The `FnMut(&Vertex) -> Iterator<Item = &Vertex>` returns // an `Iterator` to get the connected vertices. let mut cycles = traversal::dft_cycles(start, |vertex| { vertex.1.iter().map(|&i| { &graph[i] }) }); // Map `Iterator<Item = Vec<&Vertex>>` into `Iterator<Item = Vec<&str>>` let mut cycles = cycles.map(|path| path.iter().map(|vertex| vertex.0).collect::<Vec<_>>()); assert_eq!(cycles.next(), Some(vec!["A", "B", "D"])); assert_eq!(cycles.next(), Some(vec!["A", "D"])); assert_eq!(cycles.next(), Some(vec!["A", "C", "D"])); assert_eq!(cycles.next(), None);