bevy/examples/ecs
Joseph 474b55a29c
Add system.map(...) for transforming the output of a system (#8526)
# Objective

Any time we wish to transform the output of a system, we currently use
system piping to do so:

```rust
my_system.pipe(|In(x)| do_something(x))
```

Unfortunately, system piping is not a zero cost abstraction. Each call
to `.pipe` requires allocating two extra access sets: one for the second
system and one for the combined accesses of both systems. This also adds
extra work to each call to `update_archetype_component_access`, which
stacks as one adds multiple layers of system piping.

## Solution

Add the `AdapterSystem` abstraction: similar to `CombinatorSystem`, this
allows you to implement a trait to generically control how a system is
run and how its inputs and outputs are processed. Unlike
`CombinatorSystem`, this does not have any overhead when computing world
accesses which makes it ideal for simple operations such as inverting or
ignoring the output of a system.

Add the extension method `.map(...)`: this is similar to `.pipe(...)`,
only it accepts a closure as an argument instead of an `In<T>` system.

```rust
my_system.map(do_something)
```

This has the added benefit of making system names less messy: a system
that ignores its output will just be called `my_system`, instead of
`Pipe(my_system, ignore)`

---

## Changelog

TODO

## Migration Guide

The `system_adapter` functions have been deprecated: use `.map` instead,
which is a lightweight alternative to `.pipe`.

```rust
// Before:
my_system.pipe(system_adapter::ignore)
my_system.pipe(system_adapter::unwrap)
my_system.pipe(system_adapter::new(T::from))

// After:
my_system.map(std::mem::drop)
my_system.map(Result::unwrap)
my_system.map(T::from)

// Before:
my_system.pipe(system_adapter::info)
my_system.pipe(system_adapter::dbg)
my_system.pipe(system_adapter::warn)
my_system.pipe(system_adapter::error)

// After:
my_system.map(bevy_utils::info)
my_system.map(bevy_utils::dbg)
my_system.map(bevy_utils::warn)
my_system.map(bevy_utils::error)
```

---------

Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
2023-08-28 16:36:46 +00:00
..
apply_deferred.rs Small doc fix (#8889) 2023-06-19 03:58:21 +00:00
component_change_detection.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
custom_query_param.rs Fixed several missing links in docs. (#8117) 2023-04-23 17:28:36 +00:00
ecs_guide.rs Allow tuples and single plugins in add_plugins, deprecate add_plugin (#8097) 2023-06-21 20:51:03 +00:00
event.rs Require #[derive(Event)] on all Events (#7086) 2023-06-06 14:44:32 +00:00
fixed_timestep.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
generic_system.rs Remove OnUpdate system set (#8260) 2023-04-04 00:49:41 +00:00
hierarchy.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
iter_combinations.rs Improve execution of examples in CI (#9331) 2023-08-03 12:45:28 +00:00
nondeterministic_system_order.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
parallel_query.rs Improve execution of examples in CI (#9331) 2023-08-03 12:45:28 +00:00
removal_detection.rs Rename apply_system_buffers to apply_deferred (#8726) 2023-06-02 14:04:13 +00:00
run_conditions.rs Add or_else combinator to run_conditions.rs (#8714) 2023-05-31 16:52:36 +00:00
startup_system.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
state.rs Rename Interaction::Clicked -> Interaction::Pressed (#8989) (#9027) 2023-07-05 09:25:31 +00:00
system_closure.rs Allow tuples and single plugins in add_plugins, deprecate add_plugin (#8097) 2023-06-21 20:51:03 +00:00
system_param.rs Schedule-First: the new and improved add_systems (#8079) 2023-03-18 01:45:34 +00:00
system_piping.rs Add system.map(...) for transforming the output of a system (#8526) 2023-08-28 16:36:46 +00:00
timers.rs Fix timers.rs documentation (#9290) 2023-07-30 15:30:05 +00:00