DFS

Struct DFS 

Source
pub struct DFS<V, D, C>
where D: FnMut(V), C: FnMut(V),
{ /* private fields */ }
Expand description

Depth-first search over a finite graph.

Constructed via DFS::new with a builder-style API. The discovered set is persisted internally, allowing multiple calls to traverse with different start vertices while sharing visited-vertex state.

The type parameters D and C are the callback types for on_discover and on_complete, respectively.

Implementations§

Source§

impl<V> DFS<V, fn(V), fn(V)>

Source

pub fn new() -> Self

Creates a new DFS.

Defaults to outward traversal, an empty discovered set, and no callbacks. Use the builder methods to configure before calling traverse.

Source§

impl<V, D, C> DFS<V, D, C>
where D: FnMut(V), C: FnMut(V),

Source

pub fn traversal_direction(self, dir: TraversalDirection) -> Self

Sets the traversal direction (outward or inward along edges). Defaults to TraversalDirection::Outward.

Source

pub fn on_discover<D2: FnMut(V)>(self, on_discover: D2) -> DFS<V, D2, C>

Sets a callback invoked when a vertex is first discovered.

Source

pub fn on_complete<C2: FnMut(V)>(self, on_complete: C2) -> DFS<V, D, C2>

Sets a callback invoked when backtracking from a vertex after all its neighbors have been processed.

Source

pub fn discovered(self, discovered: HashSet<V>) -> Self

Provides a pre-populated discovered set, useful for resuming a traversal or excluding specific vertices.

Source

pub fn reset(&mut self)

Clears the discovered set, allowing the DFS to revisit all vertices.

Source

pub fn traverse<G>(&mut self, graph: &G, start_vertex: V)
where V: Clone + Eq + Hash, G: FinGraph<V = V>,

Traverses the graph depth-first starting from the given vertex.

Vertices already in the discovered set are skipped, and newly visited vertices are added to it. This allows multiple calls with different start vertices to share state.

§Example
let mut discover_order = Vec::new();
let mut complete_order = Vec::new();
let mut dfs = DFS::new()
    .traversal_direction(TraversalDirection::Outward)
    .on_discover(|v| discover_order.push(v))
    .on_complete(|v| complete_order.push(v));
dfs.traverse(&graph, start_vertex);

Trait Implementations§

Source§

impl<V: Debug, D, C> Debug for DFS<V, D, C>
where D: FnMut(V) + Debug, C: FnMut(V) + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<V, D, C> Default for DFS<V, D, C>
where D: FnMut(V), C: FnMut(V),

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl<V, D, C> Freeze for DFS<V, D, C>
where D: Freeze, C: Freeze,

§

impl<V, D, C> RefUnwindSafe for DFS<V, D, C>

§

impl<V, D, C> Send for DFS<V, D, C>
where D: Send, C: Send, V: Send,

§

impl<V, D, C> Sync for DFS<V, D, C>
where D: Sync, C: Sync, V: Sync,

§

impl<V, D, C> Unpin for DFS<V, D, C>
where D: Unpin, C: Unpin, V: Unpin,

§

impl<V, D, C> UnwindSafe for DFS<V, D, C>
where D: UnwindSafe, C: UnwindSafe, V: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more