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
|