hecs-schedule 0.7.0

Provides shedulable systems and parallel execution for hecs
Documentation
use anyhow::ensure;
use hecs::World;
use hecs_schedule::{CommandBuffer, GenericWorld, Schedule, SubWorld, Write};

#[test]
fn test_schedule() {
    let mut world = World::default();

    let a = world.spawn((789,));
    let b = world.reserve_entity();

    let mut schedule = Schedule::builder();

    #[derive(Default, Debug, Clone, Copy, PartialEq)]
    struct Foo {
        val: i32,
    }

    let mut value = Foo { val: 42 };

    let system = move |w: SubWorld<&i32>| -> anyhow::Result<()> {
        ensure!(*w.try_get::<i32>(a)? == 789, "Entity did not match");

        Ok(())
    };

    let spawn_system = move |mut cmd: Write<CommandBuffer>| {
        cmd.insert(b, ("b", 8));
    };

    schedule.add_system(spawn_system);
    schedule.add_system(system);
    schedule.flush();

    schedule.add_system(|mut val: Write<Foo>| {
        val.val = 56;
    });

    schedule.add_system(move |mut cmd: Write<CommandBuffer>| {
        cmd.insert_one(a, "Hello, World!");
    });

    schedule.add_system(
        move |w: SubWorld<(&&'static str, &i32)>| -> anyhow::Result<()> {
            let mut query = w.try_query_one::<(&&'static str, &i32)>(b)?;
            let (name, val) = query.get()?;

            ensure!(*name == "b" && *val == 8, "Entity does not match");

            Ok(())
        },
    );

    let mut schedule = schedule.build();
    schedule.execute_seq((&mut world, &mut value)).unwrap();

    assert_eq!(value, Foo { val: 56 });
}