SessionManager: get rid of code duplication
This commit is contained in:
parent
5bcccba4e8
commit
aac69ef4bc
1 changed files with 31 additions and 44 deletions
|
@ -41,19 +41,7 @@ defmodule Floof.SessionManager do
|
||||||
end
|
end
|
||||||
|
|
||||||
def set(key, subkey, value) do
|
def set(key, subkey, value) do
|
||||||
Agent.cast(__MODULE__, fn state ->
|
set_one_internal(key, &Map.put(&1, subkey, value))
|
||||||
{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)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_multi(_, %{}) do
|
def set_multi(_, %{}) do
|
||||||
|
@ -61,19 +49,7 @@ defmodule Floof.SessionManager do
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_multi(key, backlog) do
|
def set_multi(key, backlog) do
|
||||||
Agent.cast(__MODULE__, fn state ->
|
set_one_internal(key, &Map.merge(&1, backlog))
|
||||||
{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)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_for_all(subkey, value, origin) do
|
def set_for_all(subkey, value, origin) do
|
||||||
|
@ -121,21 +97,11 @@ defmodule Floof.SessionManager do
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete(key, subkey) do
|
def delete(key, subkey) do
|
||||||
Agent.cast(__MODULE__, fn state ->
|
xdrop_internal(key, &Map.delete(&1, subkey))
|
||||||
{_, m} = Map.get_and_update(state, key, fn ent ->
|
|
||||||
entry_onmap(ent, &Map.delete(&1, subkey))
|
|
||||||
end)
|
|
||||||
m
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def drop(key, subkeys) do
|
def drop(key, subkeys) do
|
||||||
Agent.cast(__MODULE__, fn state ->
|
xdrop_internal(key, &Map.drop(&1, subkeys))
|
||||||
{_, m} = Map.get_and_update(state, key, fn ent ->
|
|
||||||
entry_onmap(ent, &Map.drop(&1, subkeys))
|
|
||||||
end)
|
|
||||||
m
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
defp entry_dfl(got) do
|
defp entry_dfl(got) do
|
||||||
|
@ -145,11 +111,32 @@ defmodule Floof.SessionManager do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp entry_onmap(ent, f) do
|
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, m} = entry_dfl(ent)
|
||||||
case {sub, f.(m)} do
|
{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
|
{nil, %{}} -> :pop
|
||||||
x -> x
|
x -> x
|
||||||
end
|
end
|
||||||
|
end)
|
||||||
|
m
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue