Use consistent names for marker generics (#7788)

# Objective

Several places in the ECS use marker generics to avoid overlapping trait implementations, but different places alternately refer to it as `Params` and `Marker`. This is potentially confusing, since it might not be clear that the same pattern is being used. Additionally, users might be misled into thinking that the `Params` type corresponds to the `SystemParam`s of a system.

## Solution

Rename `Params` to `Marker`.
This commit is contained in:
JoJoJet 2023-02-23 04:37:08 +00:00
parent 12aadfd4a6
commit ee4c8c5ecd
6 changed files with 46 additions and 46 deletions

View File

@ -378,7 +378,7 @@ impl App {
/// # /// #
/// app.add_system(my_system); /// app.add_system(my_system);
/// ``` /// ```
pub fn add_system<P>(&mut self, system: impl IntoSystemConfig<P>) -> &mut Self { pub fn add_system<M>(&mut self, system: impl IntoSystemConfig<M>) -> &mut Self {
let mut schedules = self.world.resource_mut::<Schedules>(); let mut schedules = self.world.resource_mut::<Schedules>();
if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) { if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) {
@ -406,7 +406,7 @@ impl App {
/// # /// #
/// app.add_systems((system_a, system_b, system_c)); /// app.add_systems((system_a, system_b, system_c));
/// ``` /// ```
pub fn add_systems<P>(&mut self, systems: impl IntoSystemConfigs<P>) -> &mut Self { pub fn add_systems<M>(&mut self, systems: impl IntoSystemConfigs<M>) -> &mut Self {
let mut schedules = self.world.resource_mut::<Schedules>(); let mut schedules = self.world.resource_mut::<Schedules>();
if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) { if let Some(default_schedule) = schedules.get_mut(&*self.default_schedule_label) {
@ -420,10 +420,10 @@ impl App {
} }
/// Adds a system to the provided [`Schedule`]. /// Adds a system to the provided [`Schedule`].
pub fn add_system_to_schedule<P>( pub fn add_system_to_schedule<M>(
&mut self, &mut self,
schedule_label: impl ScheduleLabel, schedule_label: impl ScheduleLabel,
system: impl IntoSystemConfig<P>, system: impl IntoSystemConfig<M>,
) -> &mut Self { ) -> &mut Self {
let mut schedules = self.world.resource_mut::<Schedules>(); let mut schedules = self.world.resource_mut::<Schedules>();
@ -437,10 +437,10 @@ impl App {
} }
/// Adds a collection of system to the provided [`Schedule`]. /// Adds a collection of system to the provided [`Schedule`].
pub fn add_systems_to_schedule<P>( pub fn add_systems_to_schedule<M>(
&mut self, &mut self,
schedule_label: impl ScheduleLabel, schedule_label: impl ScheduleLabel,
systems: impl IntoSystemConfigs<P>, systems: impl IntoSystemConfigs<M>,
) -> &mut Self { ) -> &mut Self {
let mut schedules = self.world.resource_mut::<Schedules>(); let mut schedules = self.world.resource_mut::<Schedules>();
@ -471,7 +471,7 @@ impl App {
/// App::new() /// App::new()
/// .add_startup_system(my_startup_system); /// .add_startup_system(my_startup_system);
/// ``` /// ```
pub fn add_startup_system<P>(&mut self, system: impl IntoSystemConfig<P>) -> &mut Self { pub fn add_startup_system<M>(&mut self, system: impl IntoSystemConfig<M>) -> &mut Self {
self.add_system_to_schedule(CoreSchedule::Startup, system) self.add_system_to_schedule(CoreSchedule::Startup, system)
} }
@ -496,7 +496,7 @@ impl App {
/// ) /// )
/// ); /// );
/// ``` /// ```
pub fn add_startup_systems<P>(&mut self, systems: impl IntoSystemConfigs<P>) -> &mut Self { pub fn add_startup_systems<M>(&mut self, systems: impl IntoSystemConfigs<M>) -> &mut Self {
self.add_systems_to_schedule(CoreSchedule::Startup, systems) self.add_systems_to_schedule(CoreSchedule::Startup, systems)
} }

View File

@ -8,7 +8,7 @@ pub type BoxedCondition = Box<dyn ReadOnlySystem<In = (), Out = bool>>;
/// ///
/// Implemented for functions and closures that convert into [`System<In=(), Out=bool>`](crate::system::System) /// Implemented for functions and closures that convert into [`System<In=(), Out=bool>`](crate::system::System)
/// with [read-only](crate::system::ReadOnlySystemParam) parameters. /// with [read-only](crate::system::ReadOnlySystemParam) parameters.
pub trait Condition<Params>: sealed::Condition<Params> { pub trait Condition<Marker>: sealed::Condition<Marker> {
/// Returns a new run condition that only returns `true` /// Returns a new run condition that only returns `true`
/// if both this one and the passed `and_then` return `true`. /// if both this one and the passed `and_then` return `true`.
/// ///
@ -53,7 +53,7 @@ pub trait Condition<Params>: sealed::Condition<Params> {
/// Note that in this case, it's better to just use the run condition [`resource_exists_and_equals`]. /// Note that in this case, it's better to just use the run condition [`resource_exists_and_equals`].
/// ///
/// [`resource_exists_and_equals`]: common_conditions::resource_exists_and_equals /// [`resource_exists_and_equals`]: common_conditions::resource_exists_and_equals
fn and_then<P, C: Condition<P>>(self, and_then: C) -> AndThen<Self::System, C::System> { fn and_then<M, C: Condition<M>>(self, and_then: C) -> AndThen<Self::System, C::System> {
let a = IntoSystem::into_system(self); let a = IntoSystem::into_system(self);
let b = IntoSystem::into_system(and_then); let b = IntoSystem::into_system(and_then);
let name = format!("{} && {}", a.name(), b.name()); let name = format!("{} && {}", a.name(), b.name());
@ -100,7 +100,7 @@ pub trait Condition<Params>: sealed::Condition<Params> {
/// # app.run(&mut world); /// # app.run(&mut world);
/// # assert!(world.resource::<C>().0); /// # assert!(world.resource::<C>().0);
/// ``` /// ```
fn or_else<P, C: Condition<P>>(self, or_else: C) -> OrElse<Self::System, C::System> { fn or_else<M, C: Condition<M>>(self, or_else: C) -> OrElse<Self::System, C::System> {
let a = IntoSystem::into_system(self); let a = IntoSystem::into_system(self);
let b = IntoSystem::into_system(or_else); let b = IntoSystem::into_system(or_else);
let name = format!("{} || {}", a.name(), b.name()); let name = format!("{} || {}", a.name(), b.name());
@ -108,22 +108,22 @@ pub trait Condition<Params>: sealed::Condition<Params> {
} }
} }
impl<Params, F> Condition<Params> for F where F: sealed::Condition<Params> {} impl<Marker, F> Condition<Marker> for F where F: sealed::Condition<Marker> {}
mod sealed { mod sealed {
use crate::system::{IntoSystem, ReadOnlySystem}; use crate::system::{IntoSystem, ReadOnlySystem};
pub trait Condition<Params>: pub trait Condition<Marker>:
IntoSystem<(), bool, Params, System = Self::ReadOnlySystem> IntoSystem<(), bool, Marker, System = Self::ReadOnlySystem>
{ {
// This associated type is necessary to let the compiler // This associated type is necessary to let the compiler
// know that `Self::System` is `ReadOnlySystem`. // know that `Self::System` is `ReadOnlySystem`.
type ReadOnlySystem: ReadOnlySystem<In = (), Out = bool>; type ReadOnlySystem: ReadOnlySystem<In = (), Out = bool>;
} }
impl<Params, F> Condition<Params> for F impl<Marker, F> Condition<Marker> for F
where where
F: IntoSystem<(), bool, Params>, F: IntoSystem<(), bool, Marker>,
F::System: ReadOnlySystem, F::System: ReadOnlySystem,
{ {
type ReadOnlySystem = F::System; type ReadOnlySystem = F::System;
@ -373,8 +373,8 @@ pub mod common_conditions {
/// # /// #
/// # fn my_system() { unreachable!() } /// # fn my_system() { unreachable!() }
/// ``` /// ```
pub fn not<Params>( pub fn not<Marker>(
condition: impl Condition<Params>, condition: impl Condition<Marker>,
) -> impl ReadOnlySystem<In = (), Out = bool> { ) -> impl ReadOnlySystem<In = (), Out = bool> {
condition.pipe(|In(val): In<bool>| !val) condition.pipe(|In(val): In<bool>| !val)
} }

View File

@ -54,7 +54,7 @@ impl SystemConfig {
} }
} }
fn new_condition<P>(condition: impl Condition<P>) -> BoxedCondition { fn new_condition<M>(condition: impl Condition<M>) -> BoxedCondition {
let condition_system = IntoSystem::into_system(condition); let condition_system = IntoSystem::into_system(condition);
assert!( assert!(
condition_system.is_send(), condition_system.is_send(),
@ -100,7 +100,7 @@ pub trait IntoSystemSetConfig: sealed::IntoSystemSetConfig {
/// ///
/// The `Condition` will be evaluated at most once (per schedule run), /// The `Condition` will be evaluated at most once (per schedule run),
/// the first time a system in this set prepares to run. /// the first time a system in this set prepares to run.
fn run_if<P>(self, condition: impl Condition<P>) -> SystemSetConfig; fn run_if<M>(self, condition: impl Condition<M>) -> SystemSetConfig;
/// Suppress warnings and errors that would result from systems in this set having ambiguities /// Suppress warnings and errors that would result from systems in this set having ambiguities
/// (conflicting access but indeterminate order) with systems in `set`. /// (conflicting access but indeterminate order) with systems in `set`.
fn ambiguous_with<M>(self, set: impl IntoSystemSet<M>) -> SystemSetConfig; fn ambiguous_with<M>(self, set: impl IntoSystemSet<M>) -> SystemSetConfig;
@ -139,7 +139,7 @@ where
self.into_config().after(set) self.into_config().after(set)
} }
fn run_if<P>(self, condition: impl Condition<P>) -> SystemSetConfig { fn run_if<M>(self, condition: impl Condition<M>) -> SystemSetConfig {
self.into_config().run_if(condition) self.into_config().run_if(condition)
} }
@ -179,7 +179,7 @@ impl IntoSystemSetConfig for BoxedSystemSet {
self.into_config().after(set) self.into_config().after(set)
} }
fn run_if<P>(self, condition: impl Condition<P>) -> SystemSetConfig { fn run_if<M>(self, condition: impl Condition<M>) -> SystemSetConfig {
self.into_config().run_if(condition) self.into_config().run_if(condition)
} }
@ -254,7 +254,7 @@ impl IntoSystemSetConfig for SystemSetConfig {
self self
} }
fn run_if<P>(mut self, condition: impl Condition<P>) -> Self { fn run_if<M>(mut self, condition: impl Condition<M>) -> Self {
self.conditions.push(new_condition(condition)); self.conditions.push(new_condition(condition));
self self
} }
@ -274,7 +274,7 @@ impl IntoSystemSetConfig for SystemSetConfig {
/// ///
/// This has been implemented for boxed [`System<In=(), Out=()>`](crate::system::System) /// This has been implemented for boxed [`System<In=(), Out=()>`](crate::system::System)
/// trait objects and all functions that turn into such. /// trait objects and all functions that turn into such.
pub trait IntoSystemConfig<Params>: sealed::IntoSystemConfig<Params> { pub trait IntoSystemConfig<Marker>: sealed::IntoSystemConfig<Marker> {
/// Convert into a [`SystemConfig`]. /// Convert into a [`SystemConfig`].
#[doc(hidden)] #[doc(hidden)]
fn into_config(self) -> SystemConfig; fn into_config(self) -> SystemConfig;
@ -294,7 +294,7 @@ pub trait IntoSystemConfig<Params>: sealed::IntoSystemConfig<Params> {
/// ///
/// The `Condition` will be evaluated at most once (per schedule run), /// The `Condition` will be evaluated at most once (per schedule run),
/// when the system prepares to run. /// when the system prepares to run.
fn run_if<P>(self, condition: impl Condition<P>) -> SystemConfig; fn run_if<M>(self, condition: impl Condition<M>) -> SystemConfig;
/// Suppress warnings and errors that would result from this system having ambiguities /// Suppress warnings and errors that would result from this system having ambiguities
/// (conflicting access but indeterminate order) with systems in `set`. /// (conflicting access but indeterminate order) with systems in `set`.
fn ambiguous_with<M>(self, set: impl IntoSystemSet<M>) -> SystemConfig; fn ambiguous_with<M>(self, set: impl IntoSystemSet<M>) -> SystemConfig;
@ -303,9 +303,9 @@ pub trait IntoSystemConfig<Params>: sealed::IntoSystemConfig<Params> {
fn ambiguous_with_all(self) -> SystemConfig; fn ambiguous_with_all(self) -> SystemConfig;
} }
impl<Params, F> IntoSystemConfig<Params> for F impl<Marker, F> IntoSystemConfig<Marker> for F
where where
F: IntoSystem<(), (), Params> + sealed::IntoSystemConfig<Params>, F: IntoSystem<(), (), Marker> + sealed::IntoSystemConfig<Marker>,
{ {
fn into_config(self) -> SystemConfig { fn into_config(self) -> SystemConfig {
SystemConfig::new(Box::new(IntoSystem::into_system(self))) SystemConfig::new(Box::new(IntoSystem::into_system(self)))
@ -333,7 +333,7 @@ where
self.into_config().after(set) self.into_config().after(set)
} }
fn run_if<P>(self, condition: impl Condition<P>) -> SystemConfig { fn run_if<M>(self, condition: impl Condition<M>) -> SystemConfig {
self.into_config().run_if(condition) self.into_config().run_if(condition)
} }
@ -373,7 +373,7 @@ impl IntoSystemConfig<()> for BoxedSystem<(), ()> {
self.into_config().after(set) self.into_config().after(set)
} }
fn run_if<P>(self, condition: impl Condition<P>) -> SystemConfig { fn run_if<M>(self, condition: impl Condition<M>) -> SystemConfig {
self.into_config().run_if(condition) self.into_config().run_if(condition)
} }
@ -440,7 +440,7 @@ impl IntoSystemConfig<()> for SystemConfig {
self self
} }
fn run_if<P>(mut self, condition: impl Condition<P>) -> Self { fn run_if<M>(mut self, condition: impl Condition<M>) -> Self {
self.conditions.push(new_condition(condition)); self.conditions.push(new_condition(condition));
self self
} }
@ -465,9 +465,9 @@ mod sealed {
use super::{SystemConfig, SystemSetConfig}; use super::{SystemConfig, SystemSetConfig};
pub trait IntoSystemConfig<Params> {} pub trait IntoSystemConfig<Marker> {}
impl<Params, F: IntoSystem<(), (), Params>> IntoSystemConfig<Params> for F {} impl<Marker, F: IntoSystem<(), (), Marker>> IntoSystemConfig<Marker> for F {}
impl IntoSystemConfig<()> for BoxedSystem<(), ()> {} impl IntoSystemConfig<()> for BoxedSystem<(), ()> {}
@ -490,7 +490,7 @@ pub struct SystemConfigs {
} }
/// Types that can convert into a [`SystemConfigs`]. /// Types that can convert into a [`SystemConfigs`].
pub trait IntoSystemConfigs<Params> pub trait IntoSystemConfigs<Marker>
where where
Self: Sized, Self: Sized,
{ {
@ -550,7 +550,7 @@ where
/// Use [`run_if`](IntoSystemSetConfig::run_if) on a [`SystemSet`] if you want to make sure /// Use [`run_if`](IntoSystemSetConfig::run_if) on a [`SystemSet`] if you want to make sure
/// that either all or none of the systems are run, or you don't want to evaluate the run /// that either all or none of the systems are run, or you don't want to evaluate the run
/// condition for each contained system separately. /// condition for each contained system separately.
fn distributive_run_if<P>(self, condition: impl Condition<P> + Clone) -> SystemConfigs { fn distributive_run_if<M>(self, condition: impl Condition<M> + Clone) -> SystemConfigs {
self.into_configs().distributive_run_if(condition) self.into_configs().distributive_run_if(condition)
} }
@ -637,7 +637,7 @@ impl IntoSystemConfigs<()> for SystemConfigs {
self self
} }
fn distributive_run_if<P>(mut self, condition: impl Condition<P> + Clone) -> SystemConfigs { fn distributive_run_if<M>(mut self, condition: impl Condition<M> + Clone) -> SystemConfigs {
for config in &mut self.systems { for config in &mut self.systems {
config.conditions.push(new_condition(condition.clone())); config.conditions.push(new_condition(condition.clone()));
} }

View File

@ -190,13 +190,13 @@ impl Schedule {
} }
/// Add a system to the schedule. /// Add a system to the schedule.
pub fn add_system<P>(&mut self, system: impl IntoSystemConfig<P>) -> &mut Self { pub fn add_system<M>(&mut self, system: impl IntoSystemConfig<M>) -> &mut Self {
self.graph.add_system(system); self.graph.add_system(system);
self self
} }
/// Add a collection of systems to the schedule. /// Add a collection of systems to the schedule.
pub fn add_systems<P>(&mut self, systems: impl IntoSystemConfigs<P>) -> &mut Self { pub fn add_systems<M>(&mut self, systems: impl IntoSystemConfigs<M>) -> &mut Self {
self.graph.add_systems(systems); self.graph.add_systems(systems);
self self
} }
@ -556,7 +556,7 @@ impl ScheduleGraph {
&self.conflicting_systems &self.conflicting_systems
} }
fn add_systems<P>(&mut self, systems: impl IntoSystemConfigs<P>) { fn add_systems<M>(&mut self, systems: impl IntoSystemConfigs<M>) {
let SystemConfigs { systems, chained } = systems.into_configs(); let SystemConfigs { systems, chained } = systems.into_configs();
let mut system_iter = systems.into_iter(); let mut system_iter = systems.into_iter();
if chained { if chained {
@ -574,13 +574,13 @@ impl ScheduleGraph {
} }
} }
fn add_system<P>(&mut self, system: impl IntoSystemConfig<P>) { fn add_system<M>(&mut self, system: impl IntoSystemConfig<M>) {
self.add_system_inner(system).unwrap(); self.add_system_inner(system).unwrap();
} }
fn add_system_inner<P>( fn add_system_inner<M>(
&mut self, &mut self,
system: impl IntoSystemConfig<P>, system: impl IntoSystemConfig<M>,
) -> Result<NodeId, ScheduleBuildError> { ) -> Result<NodeId, ScheduleBuildError> {
let SystemConfig { let SystemConfig {
system, system,

View File

@ -319,7 +319,7 @@ impl<Param: SystemParam> FromWorld for SystemState<Param> {
// This trait has to be generic because we have potentially overlapping impls, in particular // This trait has to be generic because we have potentially overlapping impls, in particular
// because Rust thinks a type could impl multiple different `FnMut` combinations // because Rust thinks a type could impl multiple different `FnMut` combinations
// even though none can currently // even though none can currently
pub trait IntoSystem<In, Out, Params>: Sized { pub trait IntoSystem<In, Out, Marker>: Sized {
type System: System<In = In, Out = Out>; type System: System<In = In, Out = Out>;
/// Turns this value into its corresponding [`System`]. /// Turns this value into its corresponding [`System`].
fn into_system(this: Self) -> Self::System; fn into_system(this: Self) -> Self::System;

View File

@ -124,7 +124,7 @@ pub use system_piping::*;
/// This should be used when writing doc examples, /// This should be used when writing doc examples,
/// to confirm that systems used in an example are /// to confirm that systems used in an example are
/// valid systems. /// valid systems.
pub fn assert_is_system<In, Out, Params, S: IntoSystem<In, Out, Params>>(sys: S) { pub fn assert_is_system<In, Out, Marker, S: IntoSystem<In, Out, Marker>>(sys: S) {
if false { if false {
// Check it can be converted into a system // Check it can be converted into a system
// TODO: This should ensure that the system has no conflicting system params // TODO: This should ensure that the system has no conflicting system params
@ -137,7 +137,7 @@ pub fn assert_is_system<In, Out, Params, S: IntoSystem<In, Out, Params>>(sys: S)
/// This should be used when writing doc examples, /// This should be used when writing doc examples,
/// to confirm that systems used in an example are /// to confirm that systems used in an example are
/// valid systems. /// valid systems.
pub fn assert_is_read_only_system<In, Out, Params, S: IntoSystem<In, Out, Params>>(sys: S) pub fn assert_is_read_only_system<In, Out, Marker, S: IntoSystem<In, Out, Marker>>(sys: S)
where where
S::System: ReadOnlySystem, S::System: ReadOnlySystem,
{ {
@ -208,7 +208,7 @@ mod tests {
system.run((), &mut world); system.run((), &mut world);
} }
fn run_system<Param, S: IntoSystem<(), (), Param>>(world: &mut World, system: S) { fn run_system<Marker, S: IntoSystem<(), (), Marker>>(world: &mut World, system: S) {
let mut schedule = Schedule::default(); let mut schedule = Schedule::default();
schedule.add_system(system); schedule.add_system(system);
schedule.run(world); schedule.run(world);
@ -475,7 +475,7 @@ mod tests {
_buffer: Vec<u8>, _buffer: Vec<u8>,
} }
fn test_for_conflicting_resources<Param, S: IntoSystem<(), (), Param>>(sys: S) { fn test_for_conflicting_resources<Marker, S: IntoSystem<(), (), Marker>>(sys: S) {
let mut world = World::default(); let mut world = World::default();
world.insert_resource(BufferRes::default()); world.insert_resource(BufferRes::default());
world.insert_resource(A); world.insert_resource(A);