View Source
Orb Temperature Converter
Mix.install([
{:orb, "~> 0.0.48"},
{:wasmex, "~> 0.8.3"}
])
Define our temperature converter module using Orb
defmodule TemperatureConverter do
use Orb
Orb.I32.export_enum([:celsius, :fahrenheit])
global do
@mode 0
end
defw celsius_to_fahrenheit(celsius: F32), F32 do
celsius * (9.0 / 5.0) + 32.0
end
defw fahrenheit_to_celsius(fahrenheit: F32), F32 do
(fahrenheit - 32.0) * (5.0 / 9.0)
end
defw convert_temperature(temperature: F32), F32 do
if @mode === @celsius do
celsius_to_fahrenheit(temperature)
else
fahrenheit_to_celsius(temperature)
end
end
defw set_mode(mode: I32) do
@mode = mode
end
end
We can compile this module to the WebAssembly text format
Orb.to_wat(TemperatureConverter)
|> IO.puts()
We can run the WebAssembly module in Elixir using Wasmex
{:ok, pid} = Wasmex.start_link(%{bytes: Orb.to_wat(TemperatureConverter)})
# Wasmex.call_function(pid, :fahrenheit_to_celsius, [72.0])
Wasmex.call_function(pid, :convert_temperature, [72.0])
|> IO.inspect()
Wasmex.call_function(pid, :set_mode, [1])
Wasmex.call_function(pid, :convert_temperature, [72.0])
|> IO.inspect()