macro_rules! impl_mutator_new_methods {
(BoxMutator<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@shared Mutator, $t, ('static), |$f| $wrapper); };
(RcMutator<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@shared Mutator, $t, ('static), |$f| $wrapper); };
(ArcMutator<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@shared Mutator, $t, (Send + Sync + 'static), |$f| $wrapper); };
(BoxStatefulMutator<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@stateful StatefulMutator, $t, ('static), |$f| $wrapper); };
(RcStatefulMutator<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@stateful StatefulMutator, $t, ('static), |$f| $wrapper); };
(ArcStatefulMutator<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@stateful StatefulMutator, $t, (Send + 'static), |$f| $wrapper); };
(BoxMutatorOnce<$t:ident>, |$f:ident| $wrapper:expr) => { $crate::mutators::macros::impl_mutator_new_methods!(@once MutatorOnce, $t, ('static), |$f| $wrapper); };
(@shared $trait:ident, $t:ident, ($($bounds:tt)+), |$f:ident| $wrapper:expr) => { crate::macros::impl_common_new_methods!(semantic ($trait<$t> + $($bounds)+), |source| move |value: &mut $t| source.apply(value), |$f| $wrapper, "mutator"); };
(@stateful $trait:ident, $t:ident, ($($bounds:tt)+), |$f:ident| $wrapper:expr) => { crate::macros::impl_common_new_methods!(semantic_mut ($trait<$t> + $($bounds)+), |source| move |value: &mut $t| source.apply(value), |$f| $wrapper, "mutator"); };
(@once $trait:ident, $t:ident, ($($bounds:tt)+), |$f:ident| $wrapper:expr) => { crate::macros::impl_common_new_methods!(semantic ($trait<$t> + $($bounds)+), |source| move |value: &mut $t| source.apply(value), |$f| $wrapper, "mutator"); };
}
macro_rules! impl_mutator_common_methods {
(
$struct_name:ident < $t:ident >,
($($fn_trait_with_bounds:tt)+),
|$f:ident| $wrapper_expr:expr
) => {
$crate::mutators::macros::impl_mutator_new_methods!(
$struct_name<$t>,
|$f| $wrapper_expr
);
#[inline]
pub fn noop() -> Self {
Self::new(|_: &mut $t| {})
}
crate::macros::impl_common_name_methods!("mutator");
};
}
pub(crate) use impl_mutator_common_methods;
pub(crate) use impl_mutator_new_methods;