queue:split/2 unsafe!? => queue_split_at_most/2
Tuesday, 9th April, 2013
[updated after discussion on erlang-questions, starting here]
I’ve just discovered that queue:split(N, Queue) causes a crash if N is larger than Queue has items:
1> self().
<0.37.0>
2> Q1 = queue:new().
{[],[]}
3> Q2 = queue:in(a, Q1).
{[a],[]}
4> Q3 = queue:in(b, Q2).
{[b],[a]}
5> Q4 = queue:in(c, Q3).
{[c,b],[a]}
6> queue:split(4, Q4).
** exception error: bad argument
in function queue:split/2
called as queue:split(4,{[c,b],[a]})
7> self().
<0.45.0>
Here’s a safe split:
queue_split_at_most(N, Q) ->
case queue:len(Q) >= N of
true ->
queue:split(N,Q);
false ->
{Q, queue:new()}
end.