Current section

Files

Jump to
apa lib apa_add.ex
Raw

lib/apa_add.ex

defmodule ApaAdd do
@moduledoc """
APA : Arbitrary Precision Arithmetic - Addition - ApaAdd.
"""
@doc """
Addition - internal function - please call Apa.add(left, right)
In reference to bcmath I call this functions bc_add
"""
@spec bc_add(String.t(), String.t(), integer) :: String.t()
def bc_add(left, right, scale \\ 0)
def bc_add(left, right, scale) when is_binary(left) and is_binary(right) do
{left_int, left_dec} = ApaNumber.from_string(left)
{right_int, right_dec} = ApaNumber.from_string(right)
bc_add({left_int, left_dec}, {right_int, right_dec}, scale)
end
def bc_add({left_int, left_dec}, {right_int, right_dec}, _scale)
when left_dec < right_dec do
{shifted_right_int, shifted_dec} = ApaNumber.shift_to({right_int, right_dec}, left_dec)
ApaNumber.to_string({left_int + shifted_right_int, shifted_dec})
end
def bc_add({left_int, left_dec}, {right_int, right_dec}, _scale)
when left_dec > right_dec do
{shifted_left_int, shifted_dec} = ApaNumber.shift_to({left_int, left_dec}, right_dec)
ApaNumber.to_string({shifted_left_int + right_int, shifted_dec})
end
def bc_add({left_int, left_dec}, {right_int, _right_dec}, _scale) do
ApaNumber.to_string({left_int + right_int, left_dec})
end
def bc_add(left, right, scale) do
raise(ArgumentError, "No string input.\n
left: #{inspect(left)}
right: #{inspect(right)}
scale: #{inspect(scale)}
")
end
end