macro_rules! impl_shared_conditional_function {
(@let_function Function, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_function StatefulFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_function MutatingFunction, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_function StatefulMutatingFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_function BiFunction, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_function StatefulBiFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_function BiMutatingFunction, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_function StatefulBiMutatingFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(
$struct_name:ident < $t:ident, $r:ident >,
$shared_function_type:ident,
$else_function_trait:ident,
$($extra_bounds:tt)+
) => {
impl<$t, $r> $struct_name<$t, $r> {
pub fn or_else<F>(&self, else_function: F) -> $shared_function_type<$t, $r>
where
$t: 'static,
$r: 'static,
F: $else_function_trait<$t, $r> + $($extra_bounds)+,
{
let predicate = self.predicate.clone();
impl_shared_conditional_function!(@let_function $else_function_trait, then_function, self.function.clone());
impl_shared_conditional_function!(@let_function $else_function_trait, else_function, else_function);
$shared_function_type::new(move |t| {
if predicate.test(t) {
then_function.apply(t)
} else {
else_function.apply(t)
}
})
}
}
};
(
$struct_name:ident < $t:ident, $u:ident, $r:ident >,
$shared_function_type:ident,
$else_function_trait:ident,
into_rc,
'static
) => {
impl<$t, $u, $r> $struct_name<$t, $u, $r> {
pub fn or_else<F>(&self, else_function: F) -> $shared_function_type<$t, $u, $r>
where
$t: 'static,
$u: 'static,
$r: 'static,
F: $else_function_trait<$t, $u, $r> + 'static,
{
let predicate = self.predicate.clone();
impl_shared_conditional_function!(@let_function $else_function_trait, then_function, self.function.clone());
impl_shared_conditional_function!(@let_function $else_function_trait, else_function, else_function);
$shared_function_type::new(move |t, u| {
if predicate.test(t, u) {
then_function.apply(t, u)
} else {
else_function.apply(t, u)
}
})
}
}
};
(
$struct_name:ident < $t:ident, $u:ident, $r:ident >,
$shared_function_type:ident,
$else_function_trait:ident,
into_arc,
Send + Sync + 'static
) => {
impl<$t, $u, $r> $struct_name<$t, $u, $r> {
pub fn or_else<F>(&self, else_function: F) -> $shared_function_type<$t, $u, $r>
where
$t: 'static,
$u: 'static,
$r: 'static,
F: $else_function_trait<$t, $u, $r> + Send + Sync + 'static,
{
let predicate = self.predicate.clone();
impl_shared_conditional_function!(@let_function $else_function_trait, then_function, self.function.clone());
impl_shared_conditional_function!(@let_function $else_function_trait, else_function, else_function);
$shared_function_type::new(move |t, u| {
if predicate.test(t, u) {
then_function.apply(t, u)
} else {
else_function.apply(t, u)
}
})
}
}
};
}
pub(crate) use impl_shared_conditional_function;