<div>Since there has been some discussion about "real" code, I can provide some. The extract below comes the latest project I am working on and it was extracted from a gen server. Gen servers are spawned by a simple one by one supervisor and each represents a building. The gen server needs to keep track of:</div>



<div><br></div><div>1. How many people (i.e. users) are in the building overall;</div><div><br></div><div>2. And how many of those users are on each level. Users in the same building can comunicate with each other via codes and each code is tied to a socket pid;</div>



<div><br></div><div>3. The users dict in state contains a user_id -> #user relation. And the levels dict in state contains a level_id -> [user_id] relation (I am keeping this as a reverse index instead of a levels list inside each user because this is how I access this data);</div>



<div><br></div><div>    -record(state, { levels=dict:new(), users=dict:new(), review=30000, company_id=undefined }).</div><div>    -record(user, { codes=dict:new() }).</div><div>    -record(code, { pid=nil, counter=0 }).</div>



<div><br></div><div>There is more information in the system but that is in a database because the gen server does not care about it. The state record is what is passed around gen server callbacks.</div><div><br></div><div>



As Loïc previously said, I like to treat all the information above as data. If the user gets a new code, I would like to simply add it to the codes dictionary in the user. This is how it looks like:</div><div><br></div><div>



    User1 = User#user{ codes=dict:store(Code, #code{pid=Pid}, User#user.codes) }, </div><div>    Users1 = dict:store(UserId, User1, Users),</div><div>    { reply, ok, State#state{users=Users1} }.</div><div><br></div><div>



And that is because the snippet above is <b>not</b> showing how the User, Users and Code variables were retrieved. Indeed, it could be much better and we don't even need to compare with PHP, which contains mutable data structures. For instance, Clojure provides an assoc_in[1] (and related functions) that would allow me to write all of this as:</div>



<div><br></div><div>    { reply, ok, assoc_in(State, [users, UserId, codes], Code, #code{pid=Pid}) }</div><div><br></div><div>Which is similar to what the kvc project does. Others have mentioned lenses as well. My point is that it seems to be a common issue and others seem to be looking for (or have found) a streamlined solution, which they can present and introduce to developers using and learning the language.</div>



<div><br></div><div>[1]: <a href="http://clojuredocs.org/clojure_core/1.2.0/clojure.core/assoc-in" target="_blank">http://clojuredocs.org/clojure_core/1.2.0/clojure.core/assoc-in</a></div><div><div><br></div><div><br></div>


<div><span style="font-size:13px"><div>
<span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><b>José Valim</b></span></div><div><span style="font-family:arial,sans-serif;font-size:13px;border-collapse:collapse"><div><span style="font-family:verdana,sans-serif;font-size:x-small"><a href="http://www.plataformatec.com.br/" style="color:rgb(42,93,176)" target="_blank">www.plataformatec.com.br</a></span></div>



<div><span style="font-family:verdana,sans-serif;font-size:x-small">Skype: jv.ptec</span></div><div><span style="font-family:verdana,sans-serif;font-size:x-small">Founder and Lead Developer</span></div></span></div></span></div>



</div>
<br>