| 21 | |
| 22 | #[expect(clippy::non_ascii_literal, non_snake_case)] |
| 23 | fn define(lib: &mut StandardLibrary<'_, 'heap>) -> ModuleDef<'heap> { |
| 24 | let mut def = ModuleDef::new(); |
| 25 | |
| 26 | let Number = lib.ty.number(); |
| 27 | let Integer = lib.ty.integer(); |
| 28 | |
| 29 | let items = [ |
| 30 | ( |
| 31 | "::core::math::add", |
| 32 | &["+"] as &[&'static str], |
| 33 | decl!(lib; <T: Number, U: Number>(lhs: T, rhs: U) -> lib.ty.union([T, U])), |
| 34 | ), |
| 35 | ( |
| 36 | "::core::math::sub", |
| 37 | &["-"], |
| 38 | decl!(lib; <T: Number, U: Number>(lhs: T, rhs: U) -> lib.ty.union([T, U])), |
| 39 | ), |
| 40 | ( |
| 41 | "::core::math::mul", |
| 42 | &["*"], |
| 43 | decl!(lib; <T: Number, U: Number>(lhs: T, rhs: U) -> lib.ty.union([T, U])), |
| 44 | ), |
| 45 | ( |
| 46 | "::core::math::div", |
| 47 | &["/"], |
| 48 | decl!(lib; <>(dividend: Number, divisor: Number) -> Number), |
| 49 | ), |
| 50 | ( |
| 51 | "::core::math::rem", |
| 52 | &["%"], |
| 53 | decl!(lib; <>(dividend: Integer, divisor: Integer) -> Integer), |
| 54 | ), |
| 55 | ( |
| 56 | "::core::math::mod", |
| 57 | &[], |
| 58 | decl!(lib; <>(value: Integer, modulus: Integer) -> Integer), |
| 59 | ), |
| 60 | ( |
| 61 | "::core::math::pow", |
| 62 | &["**", "↑"], |
| 63 | // (cannot be `Integer` on return, as `exponent` can be a negative integer) |
| 64 | decl!(lib; <>(base: Number, exponent: Number) -> Number), |
| 65 | ), |
| 66 | ( |
| 67 | "::core::math::sqrt", |
| 68 | &["√"], |
| 69 | decl!(lib; <>(value: Number) -> Number), |
| 70 | ), |
| 71 | ( |
| 72 | "::core::math::cbrt", |
| 73 | &["∛"], |
| 74 | decl!(lib; <>(value: Number) -> Number), |
| 75 | ), |
| 76 | ( |
| 77 | "::core::math::root", |
| 78 | &[], // cannot use `ⁿ√` because `ⁿ` is a letter, not a symbol |
| 79 | decl!(lib; <>(value: Number, root: Number) -> Number), |
| 80 | ), |