Ultimately that is my beef with Agents - their state is entirely at the mercy of the functions that are sent to them by other processes. At least with a GenServer
it can be easily enforced that interactions with the state are simple.
Aside: In Programming Elixir 1.3 - Chapter 18: OTP Supervisors
This tree structure was used:
Supervisor
|__ Stash
|__ SubSupervisor
|__ Server
https://media.pragprog.com/titles/elixir13/code/otp-supervisor/2/sequence/lib/sequence.ex
https://media.pragprog.com/titles/elixir13/code/otp-supervisor/2/sequence/lib/sequence/supervisor.ex
https://media.pragprog.com/titles/elixir13/code/otp-supervisor/2/sequence/lib/sequence/stash.ex
https://media.pragprog.com/titles/elixir13/code/otp-supervisor/2/sequence/lib/sequence/sub_supervisor.ex
https://media.pragprog.com/titles/elixir13/code/otp-supervisor/2/sequence/lib/sequence/server.ex
In Programming Elixir 1.6 that was replaced with a :rest_for_one
strategy on
Supervisor
|__ Stash
|__ Server
The primary issue with the server
code was that the stash was only updated in the terminate callback which won’t always run. The backing store needs to be updated whenever we are certain that the new state is consistent.