Packages
electric
1.3.2
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/persistent_kv/memory.ex
defmodule Electric.PersistentKV.Memory do
use Agent
defstruct [:pid, :parent]
@type t() :: %__MODULE__{pid: pid(), parent: pid()}
@type seed_data() :: [{binary(), term()}] | %{binary() => term()}
@spec new!(seed_data()) :: t()
def new!(data \\ []) do
{:ok, pid} = start_link(data)
%__MODULE__{pid: pid, parent: self()}
end
def start_link(data \\ []) do
Agent.start_link(fn ->
data
|> Enum.to_list()
|> List.flatten()
|> Enum.reduce(%{}, fn {k, v}, m ->
Map.put(m, k, v)
end)
end)
end
def contents(s) do
s.pid
|> Agent.get(& &1)
|> Enum.sort_by(&elem(&1, 0))
end
defimpl Electric.PersistentKV do
def set(memory, key, value) do
Agent.update(memory.pid, fn data ->
notify(memory, {:set, key, value})
Map.put(data, key, value)
end)
end
def get(memory, key) do
case Agent.get(memory.pid, &Map.fetch(&1, key)) do
{:ok, data} ->
{:ok, data}
:error ->
{:error, :not_found}
end
end
defp notify(%{parent: parent}, msg) when is_pid(parent) do
send(parent, {Electric.PersistentKV.Memory, msg})
end
end
end