Files
wanderer/lib/wanderer_app/queue.ex
Dmitry Popov 4136aaad76 Initial commit
2024-09-18 01:55:30 +04:00

94 lines
1.9 KiB
Elixir

defmodule WandererApp.Queue do
@moduledoc false
def new(queue_name, items), do: queue_name |> _update(Qex.new(items))
def join(queue_name, items),
do:
queue_name
|> _insert_or_update(Qex.new(items), fn queue ->
Qex.join(queue, Qex.new(items))
end)
def push_uniq(queue_name, item) do
case Enum.member?(queue_name |> to_list!, item) do
false ->
queue_name
|> _insert_or_update(Qex.new([item]), fn queue ->
Qex.push(queue, item)
end)
_ ->
:ok
end
end
def push(queue_name, item),
do:
queue_name
|> _insert_or_update(Qex.new([item]), fn queue ->
Qex.push(queue, item)
end)
def push_front(queue_name, item),
do:
queue_name
|> _insert_or_update(Qex.new([item]), fn queue ->
Qex.push_front(queue, item)
end)
def next(queue_name) do
{{:value, item}, _q} =
queue_name
|> _lookup!()
|> Qex.pop()
{:ok, item}
end
def pop(queue_name) do
{{:value, item}, queue} =
queue_name
|> _lookup!()
|> Qex.pop()
queue_name
|> _update(queue)
{:ok, item}
end
def to_list(queue_name),
do:
{:ok,
queue_name
|> _lookup!()
|> Enum.to_list()}
def to_list!(queue_name),
do:
queue_name
|> _lookup!()
|> Enum.to_list()
def empty?(queue_name) when is_binary(queue_name) or is_atom(queue_name),
do:
queue_name
|> _lookup!()
|> Enum.empty?()
def clear(queue_name),
do:
queue_name
|> _update(Qex.new())
def _insert_or_update(queue_name, queue, update_fn),
do: WandererApp.Cache.insert_or_update(queue_name, queue, update_fn)
def _lookup!(queue_name),
do: WandererApp.Cache.lookup!(queue_name, Qex.new())
def _update(queue_name, queue),
do: WandererApp.Cache.insert(queue_name, queue)
end