pub use super::definitions::FUNCTIONS;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Category {
Math,
Aggregation,
Logical,
Text,
Date,
Lookup,
Financial,
Statistical,
Trigonometric,
Information,
Conditional,
Array,
Advanced,
ForgeNative,
MonteCarlo,
}
impl std::fmt::Display for Category {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Math => write!(f, "Math"),
Self::Aggregation => write!(f, "Aggregation"),
Self::Logical => write!(f, "Logical"),
Self::Text => write!(f, "Text"),
Self::Date => write!(f, "Date"),
Self::Lookup => write!(f, "Lookup"),
Self::Financial => write!(f, "Financial"),
Self::Statistical => write!(f, "Statistical"),
Self::Trigonometric => write!(f, "Trigonometric"),
Self::Information => write!(f, "Information"),
Self::Conditional => write!(f, "Conditional"),
Self::Array => write!(f, "Array"),
Self::Advanced => write!(f, "Advanced"),
Self::ForgeNative => write!(f, "Forge Native"),
Self::MonteCarlo => write!(f, "Monte Carlo"),
}
}
}
#[derive(Debug, Clone)]
pub struct FunctionDef {
pub name: &'static str,
pub category: Category,
pub description: &'static str,
pub syntax: &'static str,
pub demo: bool,
pub scalar: bool,
}
pub fn demo_functions() -> impl Iterator<Item = &'static FunctionDef> {
FUNCTIONS.iter().filter(|f| f.demo)
}
pub fn enterprise_functions() -> impl Iterator<Item = &'static FunctionDef> {
FUNCTIONS.iter()
}
#[must_use]
pub fn count_demo() -> usize {
FUNCTIONS.iter().filter(|f| f.demo).count()
}
#[must_use]
pub fn count_enterprise() -> usize {
FUNCTIONS.len()
}
pub fn by_category(category: Category) -> impl Iterator<Item = &'static FunctionDef> {
FUNCTIONS.iter().filter(move |f| f.category == category)
}
pub fn demo_by_category(category: Category) -> impl Iterator<Item = &'static FunctionDef> {
FUNCTIONS
.iter()
.filter(move |f| f.demo && f.category == category)
}
#[must_use]
pub fn is_demo_function(name: &str) -> bool {
FUNCTIONS.iter().any(|f| f.name == name && f.demo)
}
#[must_use]
pub fn find_function(name: &str) -> Option<&'static FunctionDef> {
FUNCTIONS.iter().find(|f| f.name == name)
}
#[must_use]
pub fn count_scalar() -> usize {
FUNCTIONS.iter().filter(|f| f.scalar).count()
}
#[must_use]
pub fn count_array_only() -> usize {
FUNCTIONS.iter().filter(|f| !f.scalar).count()
}
pub fn scalar_functions() -> impl Iterator<Item = &'static FunctionDef> {
FUNCTIONS.iter().filter(|f| f.scalar)
}
pub fn array_only_functions() -> impl Iterator<Item = &'static FunctionDef> {
FUNCTIONS.iter().filter(|f| !f.scalar)
}