Created
March 21, 2017 14:09
-
-
Save Arkham/b3bdc50b326a6e5798c5accacd32562c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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