entity-trait-system-1.0.0 has been yanked.
Entity Trait System
Entity trait system (ETS) is an alternative to entity component system. Here is a video summary.
Requires the nightly compiler and specialization feature - it's only used in a sound way.
Example
// explicitly opt in to language feature
// declare world, entities, and traits which the entities could have
world!;
let mut world = default;
// directly access arena member
let player_id = world.player.insert;
// compile time type accessor of arena member (similar)
world..insert;
// visit all arenas with types that implement trait - bound at compile time
world.par_visit_test_trait;
world.visit_test_trait;
// runtime type API - access type-erased (Any) arena
let arena_id = ;
let player_arena = world.any_arena_mut;
// unwrap: I know that this is a player and that the reference is valid
let player = player_arena
.get_mut.unwrap
..unwrap;
player.do_something_else;
API Overview
Per-Trait Methods (generated for each trait)
visit_<trait>- Immutable iteration over implementing entitiesvisit_mut_<trait>- Mutable iteration over implementing entitiesvisit_key_<trait>- Immutable iteration with(Key, &Value)tuplesvisit_key_mut_<trait>- Mutable iteration with(Key, &mut Value)tuplesretain_<trait>- Keep entities matching predicateretain_with_default_<trait>- Keep with control over non-implementing typesdiff_<trait>- Gather diff vector from immutable view, to apply later.diff_mut_<trait>- Same as previous, but from mutable view.diff_apply_<trait>- Apply diff vectorclear_<trait>- Clear all arenas implementing traitlen_<trait>- Count entities implementing traitany_arenas_<trait>- Get fixed-size array of type-erased arenas implementing traitany_arenas_mut_<trait>- Mutable version of above
World Methods
arena<T>()/arena_mut<T>()- Compile-time typed arena accessany_arena()/any_arena_mut()- Runtime type-erased accessarena_id<T>()- Get stable arena identifier - serializes to type name.clear()- Clear all arenaslen()- Total entity count across all arenas
Performance Notes
- Zero-cost abstractions: Trait checks are compile-time via specialization
- Cache-friendly: Uses
slotmap::DenseSlotMapfor contiguous storage per type - Parallel safety:
par_*methods leverage rayon for multi-threaded iteration - No virtual dispatch overhead unless explicitly using type-erased api
Rayon Support
Parallel via par_* variants.
Serde Support
Both map (serde_json) and seq (bincode) style serialization.