use bevy_utils::all_tuples;
use crate::{AddOperation, Builder, Chain, ForkClone, ForkTargetStorage, Output, UnusedTarget};
pub trait ForkCloneBuilder<Response> {
type Outputs;
fn build_fork_clone(self, source: Output<Response>, builder: &mut Builder) -> Self::Outputs;
}
macro_rules! impl_forkclonebuilder_for_tuple {
($(($F:ident, $U:ident)),*) => {
#[allow(non_snake_case)]
impl<R: 'static + Send + Sync + Clone, $($F: FnOnce(Chain<R>) -> $U),*, $($U),*> ForkCloneBuilder<R> for ($($F,)*)
{
type Outputs = ($($U,)*);
fn build_fork_clone(
self,
source: Output<R>,
builder: &mut Builder,
) -> Self::Outputs {
let targets =
[
$(
{
#[allow(unused)]
let $F = std::marker::PhantomData::<$F>;
builder.commands.spawn(UnusedTarget).id()
},
)*
];
builder.commands.add(AddOperation::new(
Some(source.scope()),
source.id(),
ForkClone::<R>::new(
ForkTargetStorage::from_iter(targets)
)
));
let ($($F,)*) = self;
let mut _idx = 0;
(
$(
{
let res = ($F)(Chain::new(targets[_idx], builder));
_idx += 1;
res
},
)*
)
}
}
}
}
all_tuples!(impl_forkclonebuilder_for_tuple, 2, 12, F, U);