use crate::{AgentId, Domain, StateDiffRef, Task};
pub trait Behavior<D: Domain>: 'static {
fn is_valid(&self, tick: u64, state: StateDiffRef<D>, agent: AgentId) -> bool;
#[allow(unused)]
fn add_own_tasks(
&self,
tick: u64,
state: StateDiffRef<D>,
agent: AgentId,
tasks: &mut Vec<Box<dyn Task<D>>>,
);
fn get_dependent_behaviors(&self) -> &'static [&'static dyn Behavior<D>] {
&[]
}
fn add_tasks(
&self,
tick: u64,
state: StateDiffRef<D>,
agent: AgentId,
tasks: &mut Vec<Box<dyn Task<D>>>,
) {
if !self.is_valid(tick, state, agent) {
return;
}
self.add_own_tasks(tick, state, agent, tasks);
self.get_dependent_behaviors()
.iter()
.for_each(|behavior| behavior.add_tasks(tick, state, agent, tasks));
}
}