use bevy_ecs::prelude::*;
use bevy_ecs::system::RunSystemError;
pub trait RunSystemLoop: Sized {
fn run_system_loop<T: IntoSystem<(), Out, Marker>, Out, Marker>(
self,
n: usize,
system: T,
) -> Vec<Result<Out, RunSystemError>> {
self.run_system_loop_with(n, || (), system)
}
fn run_system_loop_with<
InputSource,
T: IntoSystem<I, Out, Marker>,
I: SystemInput,
Out,
Marker,
>(
self,
n: usize,
input: InputSource,
system: T,
) -> Vec<Result<Out, RunSystemError>>
where
InputSource: FnMut() -> I::Inner<'static>;
}
impl RunSystemLoop for &mut World {
fn run_system_loop_with<
InputSource,
T: IntoSystem<I, Out, Marker>,
I: SystemInput,
Out,
Marker,
>(
self,
n: usize,
mut input: InputSource,
system: T,
) -> Vec<Result<Out, RunSystemError>>
where
InputSource: FnMut() -> I::Inner<'static>,
{
let mut system: T::System = IntoSystem::into_system(system);
system.initialize(self);
let mut outs = Vec::new();
for _ in 0..n {
let out = system.run(input(), self);
outs.push(out);
system.apply_deferred(self);
}
outs
}
}