bevy_mod_spatial_query 0.2.0

Spatially aware Queries for the Bevy game engine
Documentation
use bevy::ecs::query::{QueryData, QueryFilter};
use bevy::prelude::{Entity, Query};

pub struct SpatialQueryIterator<'w, 's, 'q, D: QueryData + 'static, F: QueryFilter + 'static> {
    entities: Vec<Entity>,
    query: &'q mut Query<'w, 's, D, F>,
}

impl<'w, 's, 'q, D: QueryData + 'static, F: QueryFilter + 'static>
    SpatialQueryIterator<'w, 's, 'q, D, F>
{
    pub(crate) fn with_entities(entities: Vec<Entity>, query: &'q mut Query<'w, 's, D, F>) -> Self {
        SpatialQueryIterator { entities, query }
    }
}

impl<'w, 's, 'q, D: QueryData + 'static, F: QueryFilter + 'static> Iterator
    for SpatialQueryIterator<'w, 's, 'q, D, F>
where
    'w: 'q,
    's: 'q,
{
    type Item = D::Item<'q>;

    fn next(&mut self) -> Option<Self::Item> {
        while let Some(entity) = self.entities.pop() {
            match unsafe { self.query.get_unchecked(entity) } {
                Ok(data) => {
                    return Some(unsafe { std::mem::transmute::<D::Item<'_>, D::Item<'q>>(data) });
                }
                Err(_) => continue,
            }
        }

        None
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        (0, Some(self.entities.len()))
    }
}