use crate::core::expression::{CalculusData, Expression};
use crate::core::Symbol;
use std::sync::Arc;
impl Expression {
pub fn function<S: AsRef<str>>(name: S, args: Vec<Expression>) -> Self {
Self::Function {
name: Arc::from(name.as_ref()),
args: Arc::new(args),
}
}
pub fn sqrt(arg: Expression) -> Self {
Self::function("sqrt", vec![arg])
}
pub fn derivative(expression: Expression, variable: Symbol, order: u32) -> Self {
Self::Calculus(Arc::new(CalculusData::Derivative {
expression,
variable,
order,
}))
}
pub fn integral(integrand: Expression, variable: Symbol) -> Self {
Self::Calculus(Arc::new(CalculusData::Integral {
integrand,
variable,
bounds: None,
}))
}
pub fn definite_integral(
integrand: Expression,
variable: Symbol,
start: Expression,
end: Expression,
) -> Self {
Self::Calculus(Arc::new(CalculusData::Integral {
integrand,
variable,
bounds: Some((start, end)),
}))
}
pub fn limit(expression: Expression, variable: Symbol, point: Expression) -> Self {
use crate::core::expression::LimitDirection;
Self::Calculus(Arc::new(CalculusData::Limit {
expression,
variable,
point,
direction: LimitDirection::Both,
}))
}
pub fn sum(
expression: Expression,
variable: Symbol,
start: Expression,
end: Expression,
) -> Self {
Self::Calculus(Arc::new(CalculusData::Sum {
expression,
variable,
start,
end,
}))
}
pub fn product(
expression: Expression,
variable: Symbol,
start: Expression,
end: Expression,
) -> Self {
Self::Calculus(Arc::new(CalculusData::Product {
expression,
variable,
start,
end,
}))
}
}