The core data structure is the classic "hash-map-in-a-resource" design. When designing this, we want to make the "fast enough, robust path" really obvious and easy, but avoid *requiring* it, to allow for easy refactors to custom update strategies as perf characteristics are refined in each project.
NOTE: the current design assumes uniquness. That might not be desirable!
```rust
#[derive(Resource)]
struct Index<C: Component + PartialEq, L: Lookup<Key=C>> {
// Might be a hashmap, a btreemap, or even a vector
storage: L
}
// All of the methods are defined by forwarding to L, with plumbing provided via the Lookup trait
impl Index {
fn find(&self, c: &C) -> Option<Entity> {}
fn contains(&self, c: &C) -> bool {}
fn insert(&mut self, c: C) -> Option<Entity>{
}
// Save on expensive cloning for large data structures
fn insert_by_hash<C: Hash, L: HashBackedLookup>(&mut self, c: &C){
}
fn remove(&mut self, c: &C) -> Option<Entity>;
}
```
This is typically maintained via a set of hooks with an immutable underlying component. These are provided, but must be manually added by the user.
To use:
```rust
fn get_left_hand_position(query: Query<&Transform>, index: Res<Index<Name>>) -> bevy::Result {
let left_hand_entity = index.find("left_hand")?;
let left_hand_position = query.get(left_hand_entity)?;
}