For today’s Erlang Thursday we continue looking at the queue
module and look at queue:peek/1 from the Extended API.
queue:peek/1
takes a queue as it’s argument and returns either the atom empty
if the queue is empty, or {value, Item}
where Item
is the item at the head of the queue.
QueueOne = queue:from_list([1, 2, 3, 4, 5]). % {[5,4],[1,2,3]} queue:peek(QueueOne). % {value,1} QueueOne. % {[5,4],[1,2,3]} EmptyQueue = queue:new(). % {[],[]} queue:peek(EmptyQueue). % empty
queue:peek/1
does not modify the existing queue at all either, so we can call it once as seen above, or multiple times as below, and the queue we peeked at doesn’t change.
QueueTwo = queue:from_list([a, b, c, d, e, f]). % {[f,e],[a,b,c,d]} queue:peek(QueueTwo). % {value,a} queue:peek(QueueTwo). % {value,a} queue:peek(QueueTwo). % {value,a} QueueTwo. % {[f,e],[a,b,c,d]}
And unlike we saw in the previous Erlang Thursday on queue:head/1, we can safely peek at an empty queue instead of getting an exception.
queue:head(EmptyQueue). % ** exception error: empty % in function queue:head/1 % called as queue:head({[],[]}) queue:peek(EmptyQueue). % empty
Erlang’s queue
module also contains queue:peek_r/1 which will peek at the element at the rear of the queue.
queue:peek_r(EmptyQueue). % empty queue:peek_r(QueueOne). % {value,5} queue:peek_r(QueueOne). % {value,5} queue:peek_r(QueueOne). % {value,5} queue:peek_r(QueueTwo). % {value,f} QueueTwo. % {[f,e],[a,b,c,d]} QueueOne. % {[5,4],[1,2,3]} EmptyQueue. % {[],[]}
–Proctor