defmodule Diffuser.Generator.PromptRequestQueue do use GenServer alias Diffuser.Generator.PromptRequestWorker ### GenServer API @doc """ GenServer.init/1 callback """ def init(state) do {:ok, state} end @doc """ GenServer.handle_call/3 callback """ def handle_call(:dequeue, _from, [value | state]) do {:reply, value, state} end def handle_call(:dequeue, _from, []), do: {:reply, nil, []} def handle_call(:queue, _from, state), do: {:reply, state, state} @doc """ GenServer.handle_cast/2 callback """ def handle_cast({:enqueue, value}, state) do {:noreply, state, {:continue, {:enqueue, value}}} end def handle_continue({:enqueue, value}, state) when length(state) > 0 do {:continue, {:enqueue, value}, state} end def handle_continue({:enqueue, value}, state) do PromptRequestWorker.start(value) {:noreply, state} end ### Client API / Helper functions def start_link(state \\ []) do GenServer.start_link(__MODULE__, state, name: __MODULE__) end def queue, do: GenServer.call(__MODULE__, :queue) def enqueue(value), do: GenServer.cast(__MODULE__, {:enqueue, value}) def dequeue, do: GenServer.call(__MODULE__, :dequeue) end