macro_rules! impl_shared_function_methods {
(@let_before ArcStatefulFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before RcStatefulFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before ArcStatefulMutatingFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before RcStatefulMutatingFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before ArcStatefulBiFunction, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_before RcStatefulBiFunction, $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 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 StatefulMutatingFunction, $after:ident, $value:expr) => {{
let mut value = $value;
$after.apply(&mut value)
}};
(
$struct_name:ident < $t:ident, $r:ident >,
$conditional_type:ident,
$predicate_type:ident,
$chained_function_trait:ident,
predicate_bounds = ($($predicate_bounds:tt)+),
chained_bounds = ($($chained_bounds:tt)+)
) => {
#[inline]
pub fn when<P>(&self, predicate: P) -> $conditional_type<$t, $r>
where
$t: 'static,
$r: 'static,
P: Predicate<$t> + $($predicate_bounds)+,
{
$conditional_type {
function: self.clone(),
predicate: $crate::$predicate_type::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> + $($chained_bounds)+,
{
impl_shared_function_methods!(@let_before $struct_name, before, self.clone());
impl_shared_function_methods!(@let_after $chained_function_trait, after, after);
$crate::functions::macros::impl_function_new_callback!($chained_function_trait, $struct_name, $t, |t| {
impl_shared_function_methods!(@apply_after $chained_function_trait, after, before.apply(t))
})
}
};
(
$struct_name:ident < $t:ident, $u:ident, $r:ident >,
$conditional_type:ident,
$predicate_type:ident,
$chained_function_trait:ident,
predicate_bounds = ($($predicate_bounds:tt)+),
chained_bounds = ($($chained_bounds:tt)+)
) => {
#[inline]
pub fn when<P>(&self, predicate: P) -> $conditional_type<$t, $u, $r>
where
$t: 'static,
$u: 'static,
$r: 'static,
P: BiPredicate<$t, $u> + $($predicate_bounds)+,
{
$conditional_type {
function: self.clone(),
predicate: $crate::$predicate_type::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> + $($chained_bounds)+,
{
impl_shared_function_methods!(@let_before $struct_name, before, self.clone());
impl_shared_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_shared_function_methods!(@apply_after $chained_function_trait, after, before.apply(t, u))
})
}
};
}
pub(crate) use impl_shared_function_methods;