pub struct SubsumptionNode {
pub layers: Vec<SubsumptionLayer>,
/* private fields */
}Expand description
Priority-based preemption (subsumption architecture): on each tick, tries each layer
highest-priority first. The first layer whose tick() returns Running/Success “wins” and
its status is returned for that tick - lower-priority layers aren’t ticked at all that cycle,
so their own internal progress (e.g. a SequenceNode’s current child index) is naturally
preserved rather than reset, which is what gives a preempted lower layer “resume where it left
off” semantics for free.
Fields§
§layers: Vec<SubsumptionLayer>Implementations§
Source§impl SubsumptionNode
impl SubsumptionNode
Sourcepub fn new() -> SubsumptionNode
pub fn new() -> SubsumptionNode
Create a new empty subsumption node.
Sourcepub fn add_layer(
self,
priority: u8,
behavior: Box<dyn BehaviorNode>,
) -> SubsumptionNode
pub fn add_layer( self, priority: u8, behavior: Box<dyn BehaviorNode>, ) -> SubsumptionNode
Add a layer with the given priority and behavior.
Layers are automatically sorted by priority (highest first).
Trait Implementations§
Source§impl BehaviorNode for SubsumptionNode
impl BehaviorNode for SubsumptionNode
Source§fn active_capability(&self) -> Option<&str>
fn active_capability(&self) -> Option<&str>
Forwards the winning layer’s capability (the highest-priority layer whose tick()
returned Running/Success this call) - None if every layer failed. Needs its own
tracked state (last_winning_layer, set inside tick()) since, unlike SequenceNode’s
current_index, “which layer won” isn’t otherwise recoverable after tick() returns.
Source§fn tick<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
SubsumptionNode: 'async_trait,
fn tick<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
SubsumptionNode: 'async_trait,
Source§fn children_mut(&mut self) -> Vec<&mut dyn BehaviorNode>
fn children_mut(&mut self) -> Vec<&mut dyn BehaviorNode>
Source§fn reset_self(&mut self)
fn reset_self(&mut self)
Source§fn reset<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn reset<'life0, 'async_trait>(
&'life0 mut self,
) -> Pin<Box<dyn Future<Output = Result<(), Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Source§impl Debug for SubsumptionNode
impl Debug for SubsumptionNode
Source§impl Default for SubsumptionNode
impl Default for SubsumptionNode
Source§fn default() -> SubsumptionNode
fn default() -> SubsumptionNode
Auto Trait Implementations§
impl !RefUnwindSafe for SubsumptionNode
impl !UnwindSafe for SubsumptionNode
impl Freeze for SubsumptionNode
impl Send for SubsumptionNode
impl Sync for SubsumptionNode
impl Unpin for SubsumptionNode
impl UnsafeUnpin for SubsumptionNode
Blanket Implementations§
Source§impl<T> BehaviorNodeExt for Twhere
T: BehaviorNode + ?Sized,
impl<T> BehaviorNodeExt for Twhere
T: BehaviorNode + ?Sized,
Source§fn run_until_complete<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
fn run_until_complete<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
Source§fn run_with_limit<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
max_ticks: usize,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
fn run_with_limit<'life0, 'life1, 'async_trait>(
&'life0 mut self,
ctx: &'life1 Context,
max_ticks: usize,
) -> Pin<Box<dyn Future<Output = Result<NodeStatus, Error>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: Send + 'async_trait,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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