defmodule SuperCache.Queue do
require Logger
## API
def start(name) do
spawn(fn ->
Process.register(self(), name)
loop([], [])
end)
end
@spec add(atom | pid | port | reference | {atom, atom}, any) :: any
@doc """
receives data then store in queue.
"""
def add(pid, data) do
send(pid, {:add, data})
end
@doc """
gets data from queue
"""
def get(pid) do
send(pid, {:get, self()})
receive do
data when is_tuple(data) ->
[data]
list ->
list
end
end
defp loop([pid|wait], [_|_] = data_list) do
Logger.debug("send #{inspect data_list} for #{inspect pid}")
send(pid, data_list)
loop(wait, [])
end
defp loop(wait_list, data_list) do
receive do
{:add, data} ->
loop(wait_list, [data|data_list])
{:get, from} ->
loop([from|wait_list], data_list)
end
end
end