summaryrefslogtreecommitdiff
path: root/lib/util.ex
blob: d35157bc69ac1e0c94fb56a7db1f91a6764f3cbc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
defmodule Util do

  def plusminus(number) when number > 0, do: "+#{number}"
  def plusminus(0), do: "0"
  def plusminus(number) when number < 0, do: "#{number}"

  def float_paparse(float) when is_float(float), do: {float, ""}
  def float_paparse(int) when is_integer(int), do: {(int+0.0), ""}
  def float_paparse(string) when is_binary(string) do
    string
    |> String.replace(",", ".")
    |> Float.parse()
  end

  def ets_mutate_select_each(ets, table, spec \\ [{:"$1", [], [:"$1"]}], 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