Reactive ECS plugin for Bevy.
This crate provides a framework for reactive systems using the ECS.
```rust
use bevy::prelude::*;
use bevy_compose::TemplatePlugin;
#[derive(Component, Deref)]
struct Health(i32);
#[derive(Component, Deref)]
struct Damage(i32);
#[derive(Component)]
struct Zombie;
fn main() {
App::new()
.add_plugins(TemplatePlugin::default().with_template(
// Spawning a Zombie will spawn the following components:
Zombie,
(
// This only runs once.
|| Health(100),
// This runs every time a `Health` component is updated,
// and it's guraranteed to run after the `Health` component is updated.
|entity: In, health_query: Query<&Health>| {
let health = health_query.get(*entity).unwrap();
Damage(**health * 2)
},
),
))
.add_systems(Startup, setup)
.add_systems(PostUpdate, debug)
.run();
}
fn setup(mut commands: Commands) {
commands.spawn(Zombie);
}
fn debug(query: Query<&Damage>) {
for dmg in &query {
dbg!(**dmg);
}
}
```
## Inspiration
This crate is inspired by [Xilem](https://github.com/linebender/xilem), [Concoct](https://github.com/concoct-rs/concoct) and SwiftUI with its typed approach to reactivity.