Sometimes imperative is so much easier
Take a look at the following Erlang function:
count_promises(Id, N, {_, PromisesQueue}) ->
rec_count_promises(0, Id, N, PromisesQueue).
rec_count_promises(Count, _, _, []) ->
Count;
rec_count_promises(Count, Id, N, [{Id, N, _, _} | RestQueue]) ->
rec_count_promises((Count + 1), Id, N, RestQueue);
rec_count_promises(Count, Id, N, [_ | RestQueue]) ->
rec_count_promises(Count, Id, N, RestQueue).
I am reading a codebase full of this sort of things, and it is really painful. I keep thinking back to how I would do it in C#:
public int CountPromises(int id, int n, Tuple<List<Record>, List<Record>> phase1) { int count=0; foreach(var record in phase1.Item2) { if(record.Id == id && record.N == n) count ++; } return count ; }
Yet that is imperative, and involve mutating state. I agree, it is a huge improvement, but it can be made both functionally safe and easier to read:
phase1.Items2.Count(record => record.Id == id && record.N == n);
As I said, I am currently going through a codebase full of these sort of functions, and it is painful, annoying and irritating. I am not experienced enough with Erlang to be able to tell conclusively if this is idiomatic Erlang code, but I think so.

Comments
Comment preview