//! A trait for components that let you traverse the ECS.12use crate::{3entity::Entity,4query::{ReadOnlyQueryData, ReleaseStateQueryData},5relationship::Relationship,6};78/// A component that can point to another entity, and which can be used to define a path through the ECS.9///10/// Traversals are used to [specify the direction] of [event propagation] in [`EntityEvent`] [observers].11/// The default query is `()`.12///13/// Infinite loops are possible, and are not checked for. While looping can be desirable in some contexts14/// (for example, an observer that triggers itself multiple times before stopping), following an infinite15/// traversal loop without an eventual exit will cause your application to hang. Each implementer of `Traversal`16/// is responsible for documenting possible looping behavior, and consumers of those implementations are responsible for17/// avoiding infinite loops in their code.18///19/// Traversals may be parameterized with additional data. For example, in observer event propagation, the20/// parameter `D` is the event type given in `On<E>`. This allows traversal to differ depending on event21/// data.22///23/// [specify the direction]: crate::event::PropagateEntityTrigger24/// [event propagation]: crate::observer::On::propagate25/// [observers]: crate::observer::Observer26/// [`EntityEvent`]: crate::event::EntityEvent27pub trait Traversal<D: ?Sized>: ReadOnlyQueryData + ReleaseStateQueryData {28/// Returns the next entity to visit.29fn traverse(item: Self::Item<'_, '_>, data: &D) -> Option<Entity>;30}3132impl<D> Traversal<D> for () {33fn traverse(_: Self::Item<'_, '_>, _data: &D) -> Option<Entity> {34None35}36}3738/// This provides generalized hierarchy traversal for use in [event propagation].39///40/// # Warning41///42/// Traversing in a loop could result in infinite loops for relationship graphs with loops.43///44/// [event propagation]: crate::observer::On::propagate45impl<R: Relationship, D> Traversal<D> for &R {46fn traverse(item: Self::Item<'_, '_>, _data: &D) -> Option<Entity> {47Some(item.get())48}49}505152