flax 0.7.1

An ergonomic archetypical ECS
Documentation
use flax::{component, Entity, World};

#[test]
fn prune_archetypes() {
    component! {
        a: (),
        b: (),
        c: (),
    }

    let mut world = World::new();

    let id_a = Entity::builder().tag(a()).spawn(&mut world);
    let id_ab = Entity::builder().tag(a()).tag(b()).spawn(&mut world);
    let id_ac = Entity::builder().tag(a()).tag(c()).spawn(&mut world);
    let id_abc = Entity::builder()
        .tag(a())
        .tag(b())
        .tag(c())
        .spawn(&mut world);

    // A(1)
    //  A_B(1)
    //      A_B_C(1)
    //  A_C(1)

    assert_eq!(world.prune_archetypes(), 0);
    world.despawn(id_a).unwrap();

    // A(0)
    //  A_B(1)
    //      A_B_C(1)
    //  A_C(1)

    world.despawn(id_abc).unwrap();

    // A(0)
    //  A_B(1)
    //      A_B_C(0) *
    //  A_C(1)
    assert_eq!(world.prune_archetypes(), 1);

    world.despawn(id_ac).unwrap();

    // A(0)
    //  A_B(1)
    //      A_B_C(0)
    //  A_C(0) *
    assert_eq!(world.prune_archetypes(), 1);

    world.despawn(id_ab).unwrap();

    // A(0) *
    //  A_B(0) *
    //      A_B_C(0)
    //  A_C(0)
    assert_eq!(world.prune_archetypes(), 2);
    assert_eq!(world.prune_archetypes(), 0);
}