macro_rules! impl_box_function_methods {
(@let_before BoxStatefulFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before BoxStatefulMutatingFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before $struct_name:ident, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_after StatefulFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_after StatefulMutatingFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_after $function_trait:ident, $name:ident, $value:expr) => {
let $name = $value;
};
(@apply_after Function, $after:ident, $value:expr) => {{
let value = $value;
$after.apply(&value)
}};
(@apply_after FunctionOnce, $after:ident, $value:expr) => {{
let value = $value;
$after.apply(&value)
}};
(@apply_after StatefulFunction, $after:ident, $value:expr) => {{
let value = $value;
$after.apply(&value)
}};
(@apply_after MutatingFunction, $after:ident, $value:expr) => {{
let mut value = $value;
$after.apply(&mut value)
}};
(@apply_after MutatingFunctionOnce, $after:ident, $value:expr) => {{
let mut value = $value;
$after.apply(&mut value)
}};
(@apply_after StatefulMutatingFunction, $after:ident, $value:expr) => {{
let mut value = $value;
$after.apply(&mut value)
}};
(
$struct_name:ident < $t:ident, $r:ident >,
$conditional_type:ident,
$chained_function_trait:ident
) => {
#[inline]
pub fn when<P>(self, predicate: P) -> $conditional_type<$t, $r>
where
$t: 'static,
$r: 'static,
P: Predicate<$t> + 'static,
{
$conditional_type {
function: self,
predicate: $crate::BoxPredicate::new(predicate),
}
}
#[inline]
pub fn and_then<S, F>(self, after: F) -> $struct_name<$t, S>
where
$t: 'static,
$r: 'static,
S: 'static,
F: $chained_function_trait<$r, S> + 'static,
{
impl_box_function_methods!(@let_before $struct_name, before, self.function);
impl_box_function_methods!(@let_after $chained_function_trait, after, after);
$crate::functions::macros::impl_function_new_callback!($chained_function_trait, $struct_name, $t, |t| {
impl_box_function_methods!(@apply_after $chained_function_trait, after, before(t))
})
}
};
(
$struct_name:ident < $t:ident, $u:ident, $r:ident >,
$conditional_type:ident,
$chained_function_trait:ident
) => {
#[inline]
pub fn when<P>(self, predicate: P) -> $conditional_type<$t, $u, $r>
where
$t: 'static,
$u: 'static,
$r: 'static,
P: BiPredicate<$t, $u> + 'static,
{
$conditional_type {
function: self,
predicate: $crate::BoxBiPredicate::new(predicate),
}
}
#[inline]
pub fn and_then<S, F>(self, after: F) -> $struct_name<$t, $u, S>
where
$t: 'static,
$u: 'static,
$r: 'static,
S: 'static,
F: $chained_function_trait<$r, S> + 'static,
{
impl_box_function_methods!(@let_before $struct_name, before, self.function);
impl_box_function_methods!(@let_after $chained_function_trait, after, after);
$crate::functions::macros::impl_function_new_callback!($chained_function_trait, $struct_name, $t, $u, |t, u| {
impl_box_function_methods!(@apply_after $chained_function_trait, after, before(t, u))
})
}
};
}
pub(crate) use impl_box_function_methods;