Current section
Files
Jump to
Current section
Files
lib/wasm_modules/math.ex
defmodule Firebird.WasmModules.Math do
Module.register_attribute(__MODULE__, :wasm, accumulate: true)
@moduledoc """
Mathematical functions compiled to WebAssembly.
These pure functions demonstrate Elixir-to-WASM compilation
for common math operations.
"""
@wasm true
def add(a, b), do: a + b
@wasm true
def subtract(a, b), do: a - b
@wasm true
def multiply(a, b), do: a * b
@wasm true
def divide(a, b), do: div(a, b)
@wasm true
def modulo(a, b), do: rem(a, b)
@wasm true
def negate(a), do: 0 - a
@wasm true
def abs_val(n) do
if n >= 0 do
n
else
0 - n
end
end
@wasm true
def max_val(a, b) do
if a >= b do
a
else
b
end
end
@wasm true
def min_val(a, b) do
if a <= b do
a
else
b
end
end
@wasm true
def clamp(val, lo, hi) do
if val < lo do
lo
else
if val > hi do
hi
else
val
end
end
end
@wasm true
def sign(n) do
if n > 0 do
1
else
if n < 0 do
0 - 1
else
0
end
end
end
@wasm true
def fibonacci(0), do: 0
def fibonacci(1), do: 1
def fibonacci(n), do: fibonacci(n - 1) + fibonacci(n - 2)
@wasm true
def factorial(0), do: 1
def factorial(n), do: n * factorial(n - 1)
@wasm true
def power(_, 0), do: 1
def power(base, exp), do: base * power(base, exp - 1)
@wasm true
def gcd(a, 0), do: a
def gcd(a, b), do: gcd(b, rem(a, b))
@wasm true
def sum_to(0), do: 0
def sum_to(n), do: n + sum_to(n - 1)
@wasm true
def is_even(n) do
if rem(n, 2) == 0 do
1
else
0
end
end
@wasm true
def collatz_steps(1), do: 0
def collatz_steps(n) do
if rem(n, 2) == 0 do
1 + collatz_steps(div(n, 2))
else
1 + collatz_steps(3 * n + 1)
end
end
end