Source code for amalgam.primordials.arithmetic

from __future__ import annotations

from fractions import Fraction
from typing import Union, TYPE_CHECKING

import amalgam.amalgams as am
from amalgam.primordials.utils import make_function


if TYPE_CHECKING:  # pragma: no cover
    from amalgam.environment import Environment
    from amalgam.primordials.utils import Store


ARITHMETIC: Store = {}


[docs]@make_function(ARITHMETIC, "+") def _add(env: Environment, *nums: am.Numeric) -> am.Numeric: """Returns the sum of :data:`nums`.""" return am.Numeric(sum(num.value for num in nums))
[docs]@make_function(ARITHMETIC, "-") def _sub(env: Environment, *nums: am.Numeric) -> am.Numeric: """ Subtracts :data:`nums[0]` and the summation of :data:`nums[1:]`. """ x, *ns = (num.value for num in nums) y: Union[float, Fraction] = 0 for n in ns: y += n return am.Numeric(x - y)
[docs]@make_function(ARITHMETIC, "*") def _mul(env: Environment, *nums: am.Numeric) -> am.Numeric: """Returns the product of :data:`nums`.""" prod: Union[float, Fraction] = 1 for num in nums: prod *= num.value return am.Numeric(prod)
[docs]@make_function(ARITHMETIC, "/") def _div(env: Environment, *nums: am.Numeric) -> am.Numeric: """ Divides :data:`nums[0]` and the product of :data:`nums[1:]` """ x, *ns = (num.value for num in nums) y: Union[float, Fraction] = 1 for n in ns: y *= n return am.Numeric(x / y)