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
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue