SessionManager: get rid of code duplication

This commit is contained in:
Alain Zscheile 2022-11-25 23:08:23 +01:00
parent 5bcccba4e8
commit aac69ef4bc

View file

@ -41,19 +41,7 @@ defmodule Floof.SessionManager do
end
def set(key, subkey, value) do
Agent.cast(__MODULE__, fn state ->
{sub, state2} =
Map.get_and_update(state, key, fn ent ->
{sub, m} = entry_dfl(ent)
{sub, {sub, Map.put(m, subkey, value)}}
end)
if sub != nil do
send(sub, {:SessionPushed, key})
end
state2
end)
set_one_internal(key, &Map.put(&1, subkey, value))
end
def set_multi(_, %{}) do
@ -61,19 +49,7 @@ defmodule Floof.SessionManager do
end
def set_multi(key, backlog) do
Agent.cast(__MODULE__, fn state ->
{sub, state2} =
Map.get_and_update(state, key, fn ent ->
{sub, m} = entry_dfl(ent)
{sub, {sub, Map.merge(m, backlog)}}
end)
if sub != nil do
send(sub, {:SessionPushed, key})
end
state2
end)
set_one_internal(key, &Map.merge(&1, backlog))
end
def set_for_all(subkey, value, origin) do
@ -121,21 +97,11 @@ defmodule Floof.SessionManager do
end
def delete(key, subkey) do
Agent.cast(__MODULE__, fn state ->
{_, m} = Map.get_and_update(state, key, fn ent ->
entry_onmap(ent, &Map.delete(&1, subkey))
end)
m
end)
xdrop_internal(key, &Map.delete(&1, subkey))
end
def drop(key, subkeys) do
Agent.cast(__MODULE__, fn state ->
{_, m} = Map.get_and_update(state, key, fn ent ->
entry_onmap(ent, &Map.drop(&1, subkeys))
end)
m
end)
xdrop_internal(key, &Map.drop(&1, subkeys))
end
defp entry_dfl(got) do
@ -145,11 +111,32 @@ defmodule Floof.SessionManager do
end
end
defp entry_onmap(ent, f) do
{sub, m} = entry_dfl(ent)
case {sub, f.(m)} do
{nil, %{}} -> :pop
x -> x
end
defp set_one_internal(key, handler) do
Agent.cast(__MODULE__, fn state ->
{sub, state2} =
Map.get_and_update(state, key, fn ent ->
{sub, m} = entry_dfl(ent)
{sub, {sub, handler.(m)}}
end)
if sub != nil do
send(sub, {:SessionPushed, key})
end
state2
end)
end
defp xdrop_internal(key, handler) do
Agent.cast(__MODULE__, fn state ->
{_, m} = Map.get_and_update(state, key, fn ent ->
{sub, m} = entry_dfl(ent)
case {sub, handler.(m)} do
{nil, %{}} -> :pop
x -> x
end
end)
m
end)
end
end