Idiomatic pattern matching without arity overloading. (Single function vs mutliple)

You don’t have to duplicate @impl true and @spec for each variant of the same function. Just once is enough for the compiler and Dialyzer.

For the rest, the answer is always “it depends” but I prefer to have just one handle_info and then call several different private functions depending on which arm in the case statement you’re in. I feel it gives me the opportunity to make the code more self-documented by naming the private functions properly.

Again though, just a preference depending on the size of the code, and how unreadable it would be otherwise.