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