summaryrefslogtreecommitdiff
path: root/lib/irc/client/user_cache.ex
blob: 265363089574ec9e4b9bd96f6442fd1ada3703b0 (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
defmodule Irc.Client.UserCache do

  # tuple: {nick, user}

  def init(args) do
    opts = [{:read_concurrency, true}, :protected]
    :ets.new(__MODULE__, opts)
  end

  def lookup(ets, nick) do
    case :ets.lookup(ets, nick) do
      [{^nick, user}] -> user
      _ -> nil
    end
  end

  def change(ets, nick, changes) do
    initial = if user = lookup(ets, nick), do: user, else: %Irc.User{nick: nick}
    user = User.change(initial, changes)
    put(ets, nick, user)
  end

  defp put(ets, original_nick, user) do
    tuple = {user.nick, user}
    if original_nick != user.nick do
      true = :ets.delete(ets, original_nick)
    end
    :ets.insert(ets, tuple)
  end

end