[][src]Struct traversal::DftCycles

pub struct DftCycles<'a, T, F, I> where
    T: ?Sized,
    F: FnMut(&'a T) -> I,
    I: Iterator<Item = &'a T>,
    T: Eq + Hash
{ /* fields omitted */ }

Produces all cycle paths using Depth-First Traversal (in Pre-Order).

DftCycles produces all paths that contain a cycle. Thereby all Vec<T>s produced are a path containing a cycle, as in last() is connected to first().

Example

use traversal::DftCycles;

#[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 = DftCycles::new(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);

Methods

impl<'a, T, F, I> DftCycles<'a, T, F, I> where
    T: ?Sized,
    F: FnMut(&'a T) -> I,
    I: Iterator<Item = &'a T>,
    T: Eq + Hash
[src]

pub fn new(root: &'a T, iter_connections: F) -> Self[src]

Creates a DftCycles, where root is the starting Node.

The iter_connections FnMut is (lazily) called for each Node as needed, where the returned Iterator produces the child Nodes for the given Node.

See DftCycles for more information.

"FnOnce"

The FnMut is a FnOnce from the point-of-view of a Node, as iter_connections is at most called once for each individual Node.

FusedIterator

While DftCycles does not require FusedIterator, it assumes that no Nodes are produced after a None.

Trait Implementations

impl<'a, T, F: Clone, I: Clone> Clone for DftCycles<'a, T, F, I> where
    T: Clone + ?Sized,
    F: FnMut(&'a T) -> I,
    I: Iterator<Item = &'a T>,
    T: Eq + Hash
[src]

impl<'a, T, F, I> FusedIterator for DftCycles<'a, T, F, I> where
    T: ?Sized,
    F: FnMut(&'a T) -> I,
    I: Iterator<Item = &'a T>,
    T: Eq + Hash
[src]

impl<'a, T, F, I> Iterator for DftCycles<'a, T, F, I> where
    T: ?Sized,
    F: FnMut(&'a T) -> I,
    I: Iterator<Item = &'a T>,
    T: Eq + Hash
[src]

type Item = Vec<&'a T>

The type of the elements being iterated over.

Auto Trait Implementations

impl<'a, T: ?Sized, F, I> RefUnwindSafe for DftCycles<'a, T, F, I> where
    F: RefUnwindSafe,
    T: RefUnwindSafe

impl<'a, T: ?Sized, F, I> Send for DftCycles<'a, T, F, I> where
    F: Send,
    T: Sync

impl<'a, T: ?Sized, F, I> Sync for DftCycles<'a, T, F, I> where
    F: Sync,
    T: Sync

impl<'a, T: ?Sized, F, I> Unpin for DftCycles<'a, T, F, I> where
    F: Unpin

impl<'a, T: ?Sized, F, I> UnwindSafe for DftCycles<'a, T, F, I> where
    F: UnwindSafe,
    T: RefUnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

type IntoIter = I

Which kind of iterator are we turning this into?

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.