use bevy_ecs::{
component::Component,
entity::{Entity, EntityHashSet},
};
use estr::{Estr, EstrMap};
mod ext;
pub use ext::*;
#[derive(Component, Default)]
pub struct Links {
links: EstrMap<EntityHashSet>,
}
impl Links {
pub fn set(&mut self, name: impl Into<Estr>, target: Entity) {
let link = self.links.entry(name.into()).or_default();
link.clear();
link.insert(target);
}
pub fn add(&mut self, name: impl Into<Estr>, target: Entity) {
let link = self.links.entry(name.into()).or_default();
link.insert(target);
}
pub fn remove(&mut self, name: impl Into<Estr>, target: Entity) {
let link = self.links.entry(name.into()).or_default();
link.remove(&target);
}
pub fn clear(&mut self, name: impl Into<Estr>) {
let link = self.links.entry(name.into()).or_default();
link.clear();
}
pub fn is_linked(&self, name: impl Into<Estr>, entity: Entity) -> bool {
if let Some(link) = self.links.get(&name.into()) {
link.contains(&entity)
} else {
false
}
}
pub fn get(&self, name: impl Into<Estr>) -> Option<Entity> {
self.links
.get(&name.into())
.and_then(|entities| entities.iter().next())
.copied()
}
pub fn list(&self, name: impl Into<Estr>) -> EntityHashSet {
self.links
.get(&name.into())
.cloned()
.unwrap_or(EntityHashSet::new())
}
}