From d6ee134a5957e299c3ad59011df320b3c41e6e61 Mon Sep 17 00:00:00 2001 From: href Date: Tue, 7 Jul 2020 21:39:10 +0200 Subject: pouet --- lib/util.ex | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'lib/util.ex') diff --git a/lib/util.ex b/lib/util.ex index f515936..22d1034 100644 --- a/lib/util.ex +++ b/lib/util.ex @@ -10,4 +10,38 @@ defmodule Util do |> Float.parse() end + def ets_mutate_select_each(ets, table, spec, fun) do + ets.safe_fixtable(table, true) + first = ets.select(table, spec, 1) + do_ets_mutate_select_each(ets, table, fun, first) + after + ets.safe_fixtable(table, false) + end + + defp do_ets_mutate_select_each(_, _, _, :'$end_of_table') do + :ok + end + + defp do_ets_mutate_select_each(ets, table, fun, {objs, continuation}) do + for obj <- objs, do: fun.(table, obj) + do_ets_mutate_select_each(ets, table, fun, ets.select(continuation)) + end + + + def ets_mutate_each(ets, table, fun) do + ets.safe_fixtable(table, true) + first = ets.first(table) + do_ets_mutate_each(ets, table, fun, first) + after + ets.safe_fixtable(table, false) + end + + defp do_ets_mutate_each(ets, table, fun, key) do + case ets.lookup(table, key) do + [elem] -> fun.(table, elem) + _ -> nil + end + do_ets_mutate_each(ets, table, fun, ets.next(table, key)) + end + end -- cgit v1.2.3