51 lines
1.2 KiB
Elixir
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
|