macro_rules! impl_box_conditional_transformer {
(@let_transformer Transformer, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_transformer TransformerOnce, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_transformer StatefulTransformer, $name:ident, $value:expr) => {
let mut $name = $value;
};
(@let_transformer BiTransformer, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_transformer BiTransformerOnce, $name:ident, $value:expr) => {
let $name = $value;
};
(@let_transformer StatefulBiTransformer, $name:ident, $value:expr) => {
let mut $name = $value;
};
(
$struct_name:ident<$t:ident, $r:ident>,
$transformer_type:ident,
$transformer_trait:ident
) => {
impl<$t, $r> $struct_name<$t, $r> {
pub fn or_else<F>(self, else_transformer: F) -> $transformer_type<$t, $r>
where
$t: 'static,
$r: 'static,
F: $transformer_trait<$t, $r> + 'static,
{
let predicate = self.predicate;
impl_box_conditional_transformer!(@let_transformer $transformer_trait, then_transformer, self.transformer);
impl_box_conditional_transformer!(@let_transformer $transformer_trait, else_transformer, else_transformer);
$transformer_type::new(move |t| {
if predicate.test(&t) {
then_transformer.apply(t)
} else {
else_transformer.apply(t)
}
})
}
}
};
(
$struct_name:ident<$t:ident, $u:ident, $r:ident>,
$transformer_type:ident,
$transformer_trait:ident
) => {
impl<$t, $u, $r> $struct_name<$t, $u, $r> {
pub fn or_else<F>(self, else_transformer: F) -> $transformer_type<$t, $u, $r>
where
$t: 'static,
$u: 'static,
$r: 'static,
F: $transformer_trait<$t, $u, $r> + 'static,
{
let predicate = self.predicate;
impl_box_conditional_transformer!(@let_transformer $transformer_trait, then_transformer, self.transformer);
impl_box_conditional_transformer!(@let_transformer $transformer_trait, else_transformer, else_transformer);
$transformer_type::new(move |t, u| {
if predicate.test(&t, &u) {
then_transformer.apply(t, u)
} else {
else_transformer.apply(t, u)
}
})
}
}
};
}
pub(crate) use impl_box_conditional_transformer;