Skip to content

Instantly share code, notes, and snippets.

@Arkham
Created March 21, 2017 14:09
Show Gist options
  • Save Arkham/b3bdc50b326a6e5798c5accacd32562c to your computer and use it in GitHub Desktop.
Save Arkham/b3bdc50b326a6e5798c5accacd32562c to your computer and use it in GitHub Desktop.
defmodule Frequency do
def start() do
pid = spawn(Frequency, :init, [])
Process.register(pid, :frequency)
end
def init() do
frequencies = {get_frequencies(), []}
loop(frequencies)
end
defp get_frequencies() do
[10,11,12,13,14,15]
end
def stop() do call(:stop) end
def allocate() do call(:allocate) end
def deallocate(freq) do call({:deallocate, freq}) end
## We hide all message passing and the message protocol
## in functional interfaces.
defp call(message) do
send(:frequency, {:request, self(), message})
receive do
{:reply, reply} -> reply
end
end
defp reply(pid, message) do
send(pid, {:reply, message})
end
defp loop(frequencies) do
receive do
{:request, pid, :allocate} ->
{frequencies,reply} = allocate(frequencies, pid)
reply(pid, reply)
loop(frequencies)
{:request, pid , {:deallocate, freq}} ->
frequencies = deallocate(frequencies, freq)
reply(pid, :ok)
loop(frequencies)
{:request, pid, :stop} -> reply(pid, :ok)
end
end
## The internal functions used to allocate and
## deallocate frequencies.
defp allocate({[], allocated}, _pid) do
{{[], allocated}, {:error, :no_frequencies}}
end
defp allocate({[freq|free], allocated}, pid) do
{{free, [{freq, pid}|allocated]}, {:ok, freq}}
end
defp deallocate({free, allocated}, freq) do
allocated = List.keydelete(allocated, freq, 0)
{[freq|free], allocated}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment