lib/buffer/queue.ex

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