1queue(3) Erlang Module Definition queue(3)
2
3
4
6 queue - Abstract data type for FIFO queues.
7
9 This module provides (double-ended) FIFO queues in an efficient manner.
10
11 All functions fail with reason badarg if arguments are of wrong type,
12 for example, queue arguments are not queues, indexes are not integers,
13 and list arguments are not lists. Improper lists cause internal
14 crashes. An index out of range for a queue also causes a failure with
15 reason badarg.
16
17 Some functions, where noted, fail with reason empty for an empty queue.
18
19 The data representing a queue as used by this module is to be regarded
20 as opaque by other modules. In abstract terms, the representation is a
21 composite type of existing Erlang terms. See note on data types. Any
22 code assuming knowledge of the format is running on thin ice.
23
24 All operations have an amortized O(1) running time, except all/2,
25 any/2, delete/2, delete_r/2, delete_with/2, delete_with_r/2, filter/2,
26 filtermap/2, fold/3, join/2, len/1, member/2, split/2 that have O(n).
27 To minimize the size of a queue minimizing the amount of garbage built
28 by queue operations, the queues do not contain explicit length informa‐
29 tion, and that is why len/1 is O(n). If better performance for this
30 particular operation is essential, it is easy for the caller to keep
31 track of the length.
32
33 Queues are double-ended. The mental picture of a queue is a line of
34 people (items) waiting for their turn. The queue front is the end with
35 the item that has waited the longest. The queue rear is the end an item
36 enters when it starts to wait. If instead using the mental picture of a
37 list, the front is called head and the rear is called tail.
38
39 Entering at the front and exiting at the rear are reverse operations on
40 the queue.
41
42 This module has three sets of interface functions: the "Original API",
43 the "Extended API", and the "Okasaki API".
44
45 The "Original API" and the "Extended API" both use the mental picture
46 of a waiting line of items. Both have reverse operations suffixed "_r".
47
48 The "Original API" item removal functions return compound terms with
49 both the removed item and the resulting queue. The "Extended API" con‐
50 tains alternative functions that build less garbage and functions for
51 just inspecting the queue ends. Also the "Okasaki API" functions build
52 less garbage.
53
54 The "Okasaki API" is inspired by "Purely Functional Data Structures" by
55 Chris Okasaki. It regards queues as lists. This API is by many regarded
56 as strange and avoidable. For example, many reverse operations have
57 lexically reversed names, some with more readable but perhaps less un‐
58 derstandable aliases.
59
61 queue(Item)
62
63 As returned by new/0.
64
65 queue() = queue(term())
66
69 all(Pred, Q :: queue(Item)) -> boolean()
70
71 Types:
72
73 Pred = fun((Item) -> boolean())
74
75 Returns true if Pred(Item) returns true for all items Item in Q,
76 otherwise false.
77
78 any(Pred, Q :: queue(Item)) -> boolean()
79
80 Types:
81
82 Pred = fun((Item) -> boolean())
83
84 Returns true if Pred(Item) returns true for at least one item
85 Item in Q, otherwise false.
86
87 delete(Item, Q1) -> Q2
88
89 Types:
90
91 Item = T
92 Q1 = Q2 = queue(T)
93 T = term()
94
95 Returns a copy of Q1 where the first item matching Item is
96 deleted, if there is such an item.
97
98 delete_r(Item, Q1) -> Q2
99
100 Types:
101
102 Item = T
103 Q1 = Q2 = queue(T)
104 T = term()
105
106 Returns a copy of Q1 where the last item matching Item is
107 deleted, if there is such an item.
108
109 delete_with(Pred, Q1) -> Q2
110
111 Types:
112
113 Pred = fun((Item) -> boolean())
114 Q1 = Q2 = queue(Item)
115 Item = term()
116
117 Returns a copy of Q1 where the first item for which Pred returns
118 true is deleted, if there is such an item.
119
120 delete_with_r(Pred, Q1) -> Q2
121
122 Types:
123
124 Pred = fun((Item) -> boolean())
125 Q1 = Q2 = queue(Item)
126 Item = term()
127
128 Returns a copy of Q1 where the last item for which Pred returns
129 true is deleted, if there is such an item.
130
131 filter(Fun, Q1 :: queue(Item)) -> Q2 :: queue(Item)
132
133 Types:
134
135 Fun = fun((Item) -> boolean() | [Item])
136
137 Returns a queue Q2 that is the result of calling Fun(Item) on
138 all items in Q1.
139
140 If Fun(Item) returns true, Item is copied to the result queue.
141 If it returns false, Item is not copied. If it returns a list,
142 the list elements are inserted instead of Item in the result
143 queue.
144
145 So, Fun(Item) returning [Item] is thereby semantically equiva‐
146 lent to returning true, just as returning [] is semantically
147 equivalent to returning false. But returning a list builds more
148 garbage than returning an atom.
149
150 filtermap(Fun, Q1) -> Q2
151
152 Types:
153
154 Fun = fun((Item) -> boolean() | {true, Value})
155 Q1 = queue(Item)
156 Q2 = queue(Item | Value)
157 Item = Value = term()
158
159 Returns a queue Q2 that is the result of calling Fun(Item) on
160 all items in Q1.
161
162 If Fun(Item) returns true, Item is copied to the result queue.
163 If it returns false, Item is not copied. If it returns {true,
164 NewItem}, the queue element at this position is replaced with
165 NewItem in the result queue.
166
167 fold(Fun, Acc0, Q :: queue(Item)) -> Acc1
168
169 Types:
170
171 Fun = fun((Item, AccIn) -> AccOut)
172 Acc0 = Acc1 = AccIn = AccOut = term()
173
174 Calls Fun(Item, AccIn) on successive items Item of Queue, start‐
175 ing with AccIn == Acc0. The queue is traversed in queue order,
176 that is, from front to rear. Fun/2 must return a new accumula‐
177 tor, which is passed to the next call. The function returns the
178 final value of the accumulator. Acc0 is returned if the queue is
179 empty.
180
181 Example:
182
183 > queue:fold(fun(X, Sum) -> X + Sum end, 0, queue:from_list([1,2,3,4,5])).
184 15
185 > queue:fold(fun(X, Prod) -> X * Prod end, 1, queue:from_list([1,2,3,4,5])).
186 120
187
188 from_list(L :: [Item]) -> queue(Item)
189
190 Returns a queue containing the items in L in the same order; the
191 head item of the list becomes the front item of the queue.
192
193 in(Item, Q1 :: queue(Item)) -> Q2 :: queue(Item)
194
195 Inserts Item at the rear of queue Q1. Returns the resulting
196 queue Q2.
197
198 in_r(Item, Q1 :: queue(Item)) -> Q2 :: queue(Item)
199
200 Inserts Item at the front of queue Q1. Returns the resulting
201 queue Q2.
202
203 is_empty(Q :: queue()) -> boolean()
204
205 Tests if Q is empty and returns true if so, otherwise false.
206
207 is_queue(Term :: term()) -> boolean()
208
209 Tests if Term is a queue and returns true if so, otherwise
210 false. Note that the test will return true for a term coinciding
211 with the representation of a queue, even when not constructed by
212 thus module. See also note on data types.
213
214 join(Q1 :: queue(Item), Q2 :: queue(Item)) -> Q3 :: queue(Item)
215
216 Returns a queue Q3 that is the result of joining Q1 and Q2 with
217 Q1 in front of Q2.
218
219 len(Q :: queue()) -> integer() >= 0
220
221 Calculates and returns the length of queue Q.
222
223 member(Item, Q :: queue(Item)) -> boolean()
224
225 Returns true if Item matches some element in Q, otherwise false.
226
227 new() -> queue()
228
229 Returns an empty queue.
230
231 out(Q1 :: queue(Item)) ->
232 {{value, Item}, Q2 :: queue(Item)} |
233 {empty, Q1 :: queue(Item)}
234
235 Removes the item at the front of queue Q1. Returns tuple
236 {{value, Item}, Q2}, where Item is the item removed and Q2 is
237 the resulting queue. If Q1 is empty, tuple {empty, Q1} is re‐
238 turned.
239
240 out_r(Q1 :: queue(Item)) ->
241 {{value, Item}, Q2 :: queue(Item)} |
242 {empty, Q1 :: queue(Item)}
243
244 Removes the item at the rear of queue Q1. Returns tuple {{value,
245 Item}, Q2}, where Item is the item removed and Q2 is the new
246 queue. If Q1 is empty, tuple {empty, Q1} is returned.
247
248 reverse(Q1 :: queue(Item)) -> Q2 :: queue(Item)
249
250 Returns a queue Q2 containing the items of Q1 in the reverse or‐
251 der.
252
253 split(N :: integer() >= 0, Q1 :: queue(Item)) ->
254 {Q2 :: queue(Item), Q3 :: queue(Item)}
255
256 Splits Q1 in two. The N front items are put in Q2 and the rest
257 in Q3.
258
259 to_list(Q :: queue(Item)) -> [Item]
260
261 Returns a list of the items in the queue in the same order; the
262 front item of the queue becomes the head of the list.
263
266 drop(Q1 :: queue(Item)) -> Q2 :: queue(Item)
267
268 Returns a queue Q2 that is the result of removing the front item
269 from Q1.
270
271 Fails with reason empty if Q1 is empty.
272
273 drop_r(Q1 :: queue(Item)) -> Q2 :: queue(Item)
274
275 Returns a queue Q2 that is the result of removing the rear item
276 from Q1.
277
278 Fails with reason empty if Q1 is empty.
279
280 get(Q :: queue(Item)) -> Item
281
282 Returns Item at the front of queue Q.
283
284 Fails with reason empty if Q is empty.
285
286 get_r(Q :: queue(Item)) -> Item
287
288 Returns Item at the rear of queue Q.
289
290 Fails with reason empty if Q is empty.
291
292 peek(Q :: queue(Item)) -> empty | {value, Item}
293
294 Returns tuple {value, Item}, where Item is the front item of Q,
295 or empty if Q is empty.
296
297 peek_r(Q :: queue(Item)) -> empty | {value, Item}
298
299 Returns tuple {value, Item}, where Item is the rear item of Q,
300 or empty if Q is empty.
301
304 cons(Item, Q1 :: queue(Item)) -> Q2 :: queue(Item)
305
306 Inserts Item at the head of queue Q1. Returns the new queue Q2.
307
308 daeh(Q :: queue(Item)) -> Item
309
310 Returns the tail item of queue Q.
311
312 Fails with reason empty if Q is empty.
313
314 head(Q :: queue(Item)) -> Item
315
316 Returns Item from the head of queue Q.
317
318 Fails with reason empty if Q is empty.
319
320 init(Q1 :: queue(Item)) -> Q2 :: queue(Item)
321
322 Returns a queue Q2 that is the result of removing the tail item
323 from Q1.
324
325 Fails with reason empty if Q1 is empty.
326
327 lait(Q1 :: queue(Item)) -> Q2 :: queue(Item)
328
329 Returns a queue Q2 that is the result of removing the tail item
330 from Q1.
331
332 Fails with reason empty if Q1 is empty.
333
334 The name lait/1 is a misspelling - do not use it anymore.
335
336 last(Q :: queue(Item)) -> Item
337
338 Returns the tail item of queue Q.
339
340 Fails with reason empty if Q is empty.
341
342 liat(Q1 :: queue(Item)) -> Q2 :: queue(Item)
343
344 Returns a queue Q2 that is the result of removing the tail item
345 from Q1.
346
347 Fails with reason empty if Q1 is empty.
348
349 snoc(Q1 :: queue(Item), Item) -> Q2 :: queue(Item)
350
351 Inserts Item as the tail item of queue Q1. Returns the new queue
352 Q2.
353
354 tail(Q1 :: queue(Item)) -> Q2 :: queue(Item)
355
356 Returns a queue Q2 that is the result of removing the head item
357 from Q1.
358
359 Fails with reason empty if Q1 is empty.
360
361
362
363Ericsson AB stdlib 4.2 queue(3)