diff options
Diffstat (limited to 'lib/irc/client/user_cache.ex')
-rw-r--r-- | lib/irc/client/user_cache.ex | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/irc/client/user_cache.ex b/lib/irc/client/user_cache.ex new file mode 100644 index 0000000..2653630 --- /dev/null +++ b/lib/irc/client/user_cache.ex @@ -0,0 +1,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 |