| Crates.io | plushy |
| lib.rs | plushy |
| version | 0.1.3 |
| created_at | 2023-10-07 11:05:37.830166+00 |
| updated_at | 2023-10-07 17:43:44.128551+00 |
| description | Comfiest generational arenas for Rust. |
| homepage | https://docs.rs/plushy |
| repository | https://github.com/darthdeus/comfy |
| max_upload_size | |
| id | 996237 |
| size | 13,555 |
Plushy is a comfy generational arena for arbitrary types. You can think of it
as thunderdome for all types at once, or as
an ECS where you can only have one component at a time.
Plushy is a relatively simple crate that builds on top of thunderdome, but adds a few nice things, specificaly:
Index, meaning you can't accidentally mix up your entity ids. If you insert a Player, the corresponding id is Id<Player>.Store for all of your types. With thunderdome you'd need to create a separate Arena<T> for every type T you want to store.let mut store = Store::new();
struct Enemy {
pub x: i32,
}
struct Player {
pub health: f32,
}
// New entities can just be spawned, we don't need to register
// the types anywhere.
store.spawn(Enemy { x: 1 });
store.spawn(Enemy { x: 2 });
// Store the player's ID for later
let player = store.spawn(Player { health: 100.0 });
assert_eq!(
&[1, 2],
store
.iter::<Enemy>()
.map(|t| t.1.x)
.collect::<Vec<_>>()
.as_slice()
);
// Fetch the player based on the ID. Note we don't need to write
// `store.get::<Player>(player)`, the type is inferred from the
// strongly typed ID.
assert_eq!(100.0, store.get(player.clone()).unwrap().health);
// Change player health
store.get_mut(player).unwrap().health = 200.0;
// Fetch it again and verify the change.
assert_eq!(200.0, store.get(player).unwrap().health);
Plushy is free and open source and dual licensed under MIT and Apache 2.0 licenses.