36 lines
723 B
Elixir
36 lines
723 B
Elixir
|
|
defmodule Calculator do
|
||
|
|
def start do
|
||
|
|
spawn(fn -> loop(0) end)
|
||
|
|
end
|
||
|
|
|
||
|
|
defp loop(current_value) do
|
||
|
|
new_value =
|
||
|
|
receive do
|
||
|
|
message -> process_message(current_value, message)
|
||
|
|
end
|
||
|
|
|
||
|
|
loop(new_value)
|
||
|
|
end
|
||
|
|
|
||
|
|
defp process_message(current_value, {:value, caller}) do
|
||
|
|
send(caller, {:response, current_value})
|
||
|
|
current_value
|
||
|
|
end
|
||
|
|
|
||
|
|
defp process_message(current_value, {:add, value}) do
|
||
|
|
current_value + value
|
||
|
|
end
|
||
|
|
|
||
|
|
defp process_message(current_value, {:sub, value}) do
|
||
|
|
current_value - value
|
||
|
|
end
|
||
|
|
|
||
|
|
defp process_message(current_value, {:mul, value}) do
|
||
|
|
current_value * value
|
||
|
|
end
|
||
|
|
|
||
|
|
defp process_message(current_value, {:div, value}) do
|
||
|
|
current_value / value
|
||
|
|
end
|
||
|
|
end
|