retaker 0.8.6

a simple ecs implementation
Documentation
use retaker::{work::Work, world::LockedWorld};

#[derive(Debug)]
pub struct Legged;

#[derive(Debug)]
pub struct Armed;

#[derive(Debug)]
pub struct Named(String);

fn main() {
    let world = LockedWorld::new();

    let start_work = Work::new().add_system(|world: &LockedWorld| {
        let mut world = world.lock_exclusive();

        let armed_entity = world.create_entity();
        world.insert(&armed_entity, Armed);
        world.insert(&armed_entity, Named(String::from("the armed one")));

        let legged_entity = world.create_entity();
        world.insert(&legged_entity, Legged);
        world.insert(&legged_entity, Named(String::from("the legged one")));

        let armed_and_legged_entity = world.create_entity();
        world.insert(&armed_and_legged_entity, Legged);
        world.insert(&armed_and_legged_entity, Armed);
        world.insert(
            &armed_and_legged_entity,
            Named(String::from("the legged and armed one")),
        );
    });

    let print_work = Work::new().add_system(|world: &LockedWorld| {
        let world = world.lock_shared();

        let legged_entities = world.components::<Legged>().unwrap();
        let armed_entities = world.components::<Armed>().unwrap();
        let named_entities = world.components::<Named>().unwrap();

        for legged_id in named_entities.with(legged_entities.query()) {
            let named = named_entities.get(&legged_id).unwrap();
            println!("i am legged and i can run! i am {}", named.0);
        }

        for armed_id in named_entities.with(armed_entities.query()) {
            let named = named_entities.get(&armed_id).unwrap();
            println!("i am armed and i can grab! i am {}", named.0);
        }

        for only_legged_id in named_entities.with(legged_entities.without(armed_entities.query())) {
            let named = named_entities.get(&only_legged_id).unwrap();
            println!("i am only legged so i can only run! i am {}", named.0);
        }

        for only_armed_id in named_entities.with(armed_entities.without(legged_entities.query())) {
            let named = named_entities.get(&only_armed_id).unwrap();
            println!("i am only armed so i can only grab! i am {}", named.0);
        }

        for armed_id in named_entities.with(armed_entities.query()) {
            let named = named_entities.get(&armed_id).unwrap();
            println!("i am armed and i can grab! i am {}", named.0);
        }

        for armed_and_legged_id in named_entities.with(legged_entities.with(armed_entities.query()))
        {
            let named = named_entities.get(&armed_and_legged_id).unwrap();
            println!(
                "i am armed and i can grab! but im also legged so i can also run! i am {}",
                named.0
            );
        }
    });

    start_work.run(&world);
    print_work.run(&world);
}