use crate::components::{TaskComponent, TaskProgress};
use legion::{
filter::{And, ComponentFilter, EntityFilterTuple, Passthrough},
prelude::*,
query::Query,
};
pub type TaskSystemQuery<T> = Query<(Read<TaskProgress>, Write<T>), TaskEntityFilter<T>>;
pub type TaskQuery<T> = Query<(Read<TaskProgress>, Write<T>), TaskEntityFilter<T>>;
pub type TaskEntityFilter<T> = EntityFilterTuple<
And<(ComponentFilter<TaskProgress>, ComponentFilter<T>)>,
And<(Passthrough, Passthrough)>,
And<(Passthrough, Passthrough)>,
>;
pub fn run_tasks<'a, T: 'static + TaskComponent<'a>>(
world: &mut SubWorld,
task_component_data: &mut T::Data,
task_query: &mut TaskSystemQuery<T>,
) {
for (task_progress, mut task) in task_query.iter_mut(world) {
if !task_progress.is_unblocked || task_progress.is_complete() {
continue;
}
let is_complete = task.run(task_component_data);
if is_complete {
task_progress.complete();
}
}
}
pub fn task_runner_query<'a, T: 'static + TaskComponent<'a>>() -> TaskQuery<T> {
<(Read<TaskProgress>, Write<T>)>::query()
}