locrian 0.1.0

A simple embeddable functional programming language.
Documentation
use crate::eval::EvalResult;

pub(crate) fn add(args: Vec<EvalResult>) -> EvalResult {
    EvalResult::Number(
        args.iter()
            .map(|val| {
                if let EvalResult::Number(n) = val {
                    *n
                } else {
                    0 as f64
                }
            })
            .reduce(|a, b| a + b)
            .unwrap_or(0 as f64),
    )
}

pub(crate) fn sub(args: Vec<EvalResult>) -> EvalResult {
    EvalResult::Number(
        args.iter()
            .map(|val| {
                if let EvalResult::Number(n) = val {
                    *n
                } else {
                    0 as f64
                }
            })
            .reduce(|a, b| a - b)
            .unwrap_or(0 as f64),
    )
}

pub(crate) fn mul(args: Vec<EvalResult>) -> EvalResult {
    EvalResult::Number(
        args.iter()
            .map(|val| {
                if let EvalResult::Number(n) = val {
                    *n
                } else {
                    0 as f64
                }
            })
            .reduce(|a, b| a * b)
            .unwrap_or(0 as f64),
    )
}

pub(crate) fn div(args: Vec<EvalResult>) -> EvalResult {
    EvalResult::Number(
        args.iter()
            .map(|val| {
                if let EvalResult::Number(n) = val {
                    *n
                } else {
                    0 as f64
                }
            })
            .reduce(|a, b| a / b)
            .unwrap_or(0 as f64),
    )
}

pub(crate) fn pow(args: Vec<EvalResult>) -> EvalResult {
    EvalResult::Number(
        args.iter()
            .map(|val| {
                if let EvalResult::Number(n) = val {
                    *n
                } else {
                    0 as f64
                }
            })
            .reduce(|a, b| a.powf(b))
            .unwrap_or(0 as f64),
    )
}