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