macro_rules! make_higher_order_function_expr_and_func {
($UDF:ident, $EXPR_FN:ident, $($arg:ident)*, $DOC:expr, $HIGHER_ORDER_UDF_FN:ident) => {
make_higher_order_function_expr_and_func!($UDF, $EXPR_FN, $($arg)*, $DOC, $HIGHER_ORDER_UDF_FN, $UDF::new);
};
($UDF:ident, $EXPR_FN:ident, $($arg:ident)*, $DOC:expr, $HIGHER_ORDER_UDF_FN:ident, $CTOR:path) => {
#[doc = $DOC]
pub fn $EXPR_FN($($arg: datafusion_expr::Expr),*) -> datafusion_expr::Expr {
datafusion_expr::Expr::HigherOrderFunction(datafusion_expr::expr::HigherOrderFunction::new(
$HIGHER_ORDER_UDF_FN(),
vec![$($arg),*],
))
}
create_higher_order!($UDF, $HIGHER_ORDER_UDF_FN, $CTOR);
};
($UDF:ident, $EXPR_FN:ident, $DOC:expr, $HIGHER_ORDER_UDF_FN:ident) => {
make_higher_order_function_expr_and_func!($UDF, $EXPR_FN, $DOC, $HIGHER_ORDER_UDF_FN, $UDF::new);
};
($UDF:ident, $EXPR_FN:ident, $DOC:expr, $HIGHER_ORDER_UDF_FN:ident, $CTOR:path) => {
#[doc = $DOC]
pub fn $EXPR_FN(arg: Vec<datafusion_expr::Expr>) -> datafusion_expr::Expr {
datafusion_expr::Expr::HigherOrderFunction(datafusion_expr::expr::HigherOrderFunction::new(
$HIGHER_ORDER_UDF_FN(),
arg,
))
}
create_higher_order!($UDF, $HIGHER_ORDER_UDF_FN, $CTOR);
};
}
macro_rules! create_higher_order {
($UDF:ident, $HIGHER_ORDER_UDF_FN:ident) => {
create_higher_order!($UDF, $HIGHER_ORDER_UDF_FN, $UDF::new);
};
($UDF:ident, $HIGHER_ORDER_UDF_FN:ident, $CTOR:path) => {
#[doc = concat!("HigherOrderFunction that returns a [`HigherOrderUDF`](datafusion_expr::HigherOrderUDF) for ")]
#[doc = stringify!($UDF)]
pub fn $HIGHER_ORDER_UDF_FN() -> std::sync::Arc<datafusion_expr::HigherOrderUDF> {
static INSTANCE: std::sync::LazyLock<std::sync::Arc<datafusion_expr::HigherOrderUDF>> =
std::sync::LazyLock::new(|| {
std::sync::Arc::new(datafusion_expr::HigherOrderUDF::new_from_impl($CTOR()))
});
std::sync::Arc::clone(&INSTANCE)
}
};
}