use crate::query::SimpleQuery;
use crate::simple_world::EntityId as SimpleEntityId;
use crate::simple_world::SimpleWorld;
use soroban_sdk::{Env, Vec};
#[derive(Debug, Clone)]
pub struct SimpleQueryState {
query: SimpleQuery,
cached_results: Vec<SimpleEntityId>,
cached_version: u64,
}
impl SimpleQueryState {
pub fn new(query: SimpleQuery, env: &Env) -> Self {
Self {
query,
cached_results: Vec::new(env),
cached_version: 0,
}
}
pub fn execute<'a>(&'a mut self, world: &SimpleWorld, env: &Env) -> &'a Vec<SimpleEntityId> {
if self.cached_version != world.version() {
self.cached_results = self.query.execute(world, env);
self.cached_version = world.version();
}
&self.cached_results
}
pub fn invalidate(&mut self) {
self.cached_version = 0;
}
pub fn is_valid(&self, world_version: u64) -> bool {
self.cached_version == world_version
}
pub fn query(&self) -> &SimpleQuery {
&self.query
}
}
pub struct SimpleQueryCache {
state: SimpleQueryState,
}
impl SimpleQueryCache {
pub fn new(component_type: soroban_sdk::Symbol, env: &Env) -> Self {
Self {
state: SimpleQueryState::new(SimpleQuery::new(env).with_component(component_type), env),
}
}
pub fn from_query(query: SimpleQuery, env: &Env) -> Self {
Self {
state: SimpleQueryState::new(query, env),
}
}
pub fn execute(&mut self, world: &SimpleWorld, env: &Env) -> &Vec<SimpleEntityId> {
self.state.execute(world, env)
}
pub fn invalidate(&mut self) {
self.state.invalidate();
}
pub fn is_valid(&self, world_version: u64) -> bool {
self.state.is_valid(world_version)
}
pub fn query(&self) -> &SimpleQuery {
self.state.query()
}
}