Packages

Distributed supervisor & process registry built with DELTA-CRDTs

Current section

Files

Jump to
horde_classic lib horde table_utils.ex
Raw

lib/horde/table_utils.ex

defmodule HordeClassic.TableUtils do
@moduledoc false
def new_table(name) do
:ets.new(name, [:set, :protected])
end
def size_of(table) do
:ets.info(table, :size)
end
def get_item(table, id) do
case :ets.lookup(table, id) do
[{_, item}] -> item
[] -> nil
end
end
def delete_item(table, id) do
:ets.delete(table, id)
table
end
def pop_item(table, id) do
item = get_item(table, id)
delete_item(table, id)
{item, table}
end
def put_item(table, id, item) do
:ets.insert(table, {id, item})
table
end
def all_items_values(table) do
:ets.select(table, [{{:"$1", :"$2"}, [], [:"$2"]}])
end
def any_item(table, predicate) do
try do
:ets.safe_fixtable(table, true)
first_key = :ets.first(table)
ets_any?(table, predicate, first_key)
after
:ets.safe_fixtable(table, false)
end
end
def ets_any?(_table, _predicate, :"$end_of_table") do
false
end
def ets_any?(table, predicate, key) do
entry = get_item(table, key)
if predicate.(entry) do
true
else
ets_any?(table, predicate, :ets.next(table, key))
end
end
end