Diffuser/lib/diffuser/generator/prompt_request_queue.ex

51 lines
1.2 KiB
Elixir

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