#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SystemFnArity {
    Unary,
    Binary,
    Nary,
}

pub fn resolve(arity: SystemFnArity, name: &str) -> Option<u8> {
    use SystemFnArity::*;

    // NOTE: The indices here must match those defined in system.zig.
    Some(match (arity, name) {
        (Binary, "+") => 0x00,
        (Binary, "-") => 0x01,
        (Binary, "*") => 0x02,
        (Binary, "/") => 0x03,
        (Unary, "-") => 0x04,

        (Nary, "floor") => 0x10,
        (Nary, "ceil") => 0x11,
        (Nary, "round") => 0x12,
        (Nary, "abs") => 0x13,
        (Nary, "mod") => 0x14,
        (Nary, "pow") => 0x15,
        (Nary, "sqrt") => 0x16,
        (Nary, "cbrt") => 0x17,
        (Nary, "exp") => 0x18,
        (Nary, "exp2") => 0x19,
        (Nary, "ln") => 0x1a,
        (Nary, "log2") => 0x1b,
        (Nary, "log10") => 0x1c,
        (Nary, "hypot") => 0x1d,
        (Nary, "sin") => 0x1e,
        (Nary, "cos") => 0x1f,
        (Nary, "tan") => 0x20,
        (Nary, "asin") => 0x21,
        (Nary, "acos") => 0x22,
        (Nary, "atan") => 0x23,
        (Nary, "atan2") => 0x24,
        (Nary, "expMinus1") => 0x25,
        (Nary, "ln1Plus") => 0x26,
        (Nary, "sinh") => 0x27,
        (Nary, "cosh") => 0x28,
        (Nary, "tanh") => 0x29,
        (Nary, "asinh") => 0x2a,
        (Nary, "acosh") => 0x2b,
        (Nary, "atanh") => 0x2c,
        (Nary, "min") => 0x2d,
        (Nary, "max") => 0x2e,
        (Nary, "lerp") => 0x30,

        (Unary, "!") => 0x40,
        (Binary, "==") => 0x41,
        (Binary, "!=") => 0x42,
        (Binary, "<") => 0x43,
        (Binary, "<=") => 0x44,
        (Binary, ">") => 0x45,
        (Binary, ">=") => 0x46,

        (Nary, "vec") => 0x80,
        (Nary, "vecX") => 0x81,
        (Nary, "vecY") => 0x82,
        (Nary, "vecZ") => 0x83,
        (Nary, "vecW") => 0x84,

        (Nary, "rgba") => 0x85,
        (Nary, "rgbaR") => 0x86,
        (Nary, "rgbaG") => 0x87,
        (Nary, "rgbaB") => 0x88,
        (Nary, "rgbaA") => 0x89,

        (Nary, "len") => 0x90,
        (Nary, "index") => 0x91,
        (Nary, "range") => 0x92,
        (Nary, "map") => 0x93,
        (Nary, "filter") => 0x94,
        (Nary, "reduce") => 0x95,
        (Nary, "flatten") => 0x96,

        (Nary, "toShape") => 0xc0,
        (Nary, "line") => 0xc1,
        (Nary, "rect") => 0xc2,
        (Nary, "circle") => 0xc3,

        (Nary, "stroke") => 0xe0,
        (Nary, "fill") => 0xe1,

        (Nary, "withDotter") => 0xf0,

        _ => return None,
    })
}
