Current section

Files

Jump to
sorcery lib src access.ex
Raw

lib/src/access.ex

defmodule Sorcery.Src.Access do
alias Sorcery.Src.Utils
@moduledoc """
Functions to help implement Access for the Src struct.
"""
def fetch(%{changes_db: ch, original_db: og, deletes: del}, k) do
db = Map.merge(og, ch) |> Utils.remove_dels_from_db(del)
Map.fetch(db, k)
end
def get_and_update(%{changes_db: ch} = src, k, cb) do
case fetch(src, k) do
{:ok, value} ->
case cb.(value) do
{current_value, new_value} ->
new_changes = Map.put(ch, k, new_value)
new_data = Map.put(src, :changes_db, new_changes)
{current_value, new_data}
:pop ->
new_data = Map.delete(src, k)
{value, new_data}
end
:error ->
case cb.(nil) do
{current_value, new_value} ->
new_changes = Map.put(ch, k, new_value)
new_data = Map.put(src, :changes_db, new_changes)
{current_value, new_data}
:pop ->
new_data = Map.delete(src, k)
{nil, new_data}
end
end
end
def get_and_update(src, k, cb) do
value = Map.get(src, k)
case cb.(value) do
{current_value, new_value} ->
new_data = Map.put(src, k, new_value)
{current_value, new_data}
:pop ->
new_data = Map.delete(src, k)
{value, new_data}
end
end
def pop(src, k) do
value = Map.get(src, k)
data = Map.delete(src, k)
{value, data}
end
end