[erlang-questions] Using a queue

Richard A. O'Keefe <>
Tue Aug 26 05:19:39 CEST 2008

On 26 Aug 2008, at 12:53 pm,  wrote:
> 6> Q6 = queue:out(Q5).
> {{value,"foo"},{["stuff","blah"],["bar"]}}
> 7> Q7 = queue:in("stuff1", Q6).
> =ERROR REPORT==== 25-Aug-2008::20:23:40 ===
> Error in process <0.31.0> with exit value: {badarg,[{queue,in,
> ["stuff1",{{value,"foo"},{["stuff","blah"],["bar"]}}]},
> {erl_eval,do_apply,5},{erl_eval,expr,5},{shell,exprs,6},
> {shell,eval_loop,3}]}

Well, yes.  Of course.

Here's the documentation:

out(Q1) -> Result


         Result = {{value, Item}, Q2} | {empty, Q1}
         Q1 = Q2 = queue()

     Removes the item at the front of queue Q1.
     Returns the tuple {{value, Item}, Q2},
     where Item is the item removed and Q2 is the resulting queue.
     If Q1 is empty, the tuple {empty, Q1} is returned.

So you use it like

     case queue:out(Q5)
       of {empty,Q6} ->
          what to do if Q5 is empty
        ; {{value,Item},Q6} ->
          what to do if Q5 had a first element Item
          and remaining elements Q6

Or, if you know that Q5 is not empty (and are willing to have
it treated as an error if it isn't), as

     {{value,Elem6},Q6} = queue:out(Q5).

If, as seems to be the case in your example, you don't
actually want Elem6, but simply to remove the first
element and throw it away, there is a function in the
queue interface that does exactly what you want:

	Q6 = queue:tail(Q5)

(It's in the documentation below 'Okasaki API'.)
You could also queue

	Q6 = queue:drop(Q5)

As far as I can see there is no difference between
these functions; use whatever you feel is clearer.

More information about the erlang-questions mailing list