Packages

Read only data store for Elixir: fast, concurrently, for large data & hot reloadable.

Current section

Files

Jump to
mnemonics lib mnemonics.ex
Raw

lib/mnemonics.ex

defmodule Mnemonics do
@moduledoc """
Read only data store for Elixir: fast, concurrently, for large data & hot reloadable.
iex> Example.create_example_ets :mnemonics_example
iex> defmodule MnemonicsExample do
iex> use Mnemonics, table_name: :mnemonics_example
iex> end
iex> MnemonicsExample.load 1
:ok
iex> :ets.lookup MnemonicsExample.table_name(1), 1
[{1, %Mnemonics.Example{id: 1, name: "1"}}]
"""
defmacro __using__(table_name: table_name) do
quote do
@doc """
Load an ETS table from file.
"""
@spec load(non_neg_integer) :: :ok | {:error, term}
def load(version), do: GenServer.call Mnemonics.Repo, {:load_table, __MODULE__, unquote(table_name), version}
@doc """
Get a latest table.
"""
@spec table :: Mnemonics.Memory.t
def table do
Mnemonics.Repo.tables
|> Enum.filter(&(elem(&1, 1).table_name == unquote(table_name)))
|> Enum.max_by(&elem(&1, 1).version)
|> elem(1)
end
@doc """
Get a table of the version.
"""
@spec table(non_neg_integer) :: Mnemonics.Memory.t
def table(version) do
Mnemonics.Repo.tables
|> Enum.find(fn {_, memory} ->
memory.table_name == unquote(table_name) and memory.version == version
end)
|> elem(1)
end
@doc """
Get a latest table reference.
"""
@spec table_name :: :ets.tid
def table_name, do: table().tid
@doc """
Get a table reference of the version.
"""
@spec table_name(non_neg_integer) :: :ets.tid
def table_name(version), do: table(version).tid
end
end
end