77 *
88 * @example from "queue" include Queue
99 *
10+ * @example
11+ * let queue = Queue.fromList([0, 1])
12+ * Queue.push(2, queue)
13+ * assert Queue.pop(queue) == Some(0)
14+ * assert Queue.pop(queue) == Some(1)
15+ * assert Queue.pop(queue) == Some(2)
16+ *
1017 * @since v0.2.0
1118 */
1219module Queue
@@ -33,6 +40,9 @@ abstract record Queue<a> {
3340 * @param size: The initial storage size of the queue
3441 * @returns An empty queue
3542 *
43+ * @example Queue.make() // Creates a new queue
44+ * @example Queue.make(size=16) // Creates a new queue with an initial size of 16
45+ *
3646 * @since v0.6.0
3747 */
3848provide let make = (size=16) => {
@@ -45,6 +55,9 @@ provide let make = (size=16) => {
4555 * @param queue: The queue to check
4656 * @returns `true` if the queue has no items or `false` otherwise
4757 *
58+ * @example Queue.isEmpty(Queue.make()) == true
59+ * @example Queue.isEmpty(Queue.fromList([1, 2])) == false
60+ *
4861 * @since v0.6.0
4962 */
5063provide let isEmpty = queue => queue.size == 0
@@ -55,6 +68,9 @@ provide let isEmpty = queue => queue.size == 0
5568 * @param queue: The queue to inspect
5669 * @returns The count of the items in the queue
5770 *
71+ * @example Queue.size(Queue.make()) == 0
72+ * @example Queue.size(Queue.fromList([1, 2])) == 2
73+ *
5874 * @since v0.6.0
5975 */
6076provide let size = queue => queue.size
@@ -65,6 +81,12 @@ provide let size = queue => queue.size
6581 * @param queue: The queue to inspect
6682 * @returns `Some(value)` containing the value at the beginning of the queue or `None` otherwise.
6783 *
84+ * @example Queue.peek(Queue.make()) == None
85+ * @example
86+ * let queue = Queue.make()
87+ * Queue.push(1, queue)
88+ * assert Queue.peek(queue) == Some(1)
89+ *
6890 * @since v0.6.0
6991 */
7092provide let peek = queue => {
@@ -77,6 +99,12 @@ provide let peek = queue => {
7799 * @param value: The item to be added
78100 * @param queue: The queue being updated
79101 *
102+ * @example
103+ * let queue = Queue.make()
104+ * assert Queue.peek(queue) == None
105+ * Queue.push(1, queue)
106+ * assert Queue.peek(queue) == Some(1)
107+ *
80108 * @since v0.6.0
81109 */
82110provide let push = (value, queue) => {
@@ -111,6 +139,12 @@ provide let push = (value, queue) => {
111139 * @param queue: The queue being updated
112140 * @returns The element removed from the queue
113141 *
142+ * @example
143+ * let queue = Queue.make()
144+ * Queue.push(1, queue)
145+ * assert Queue.pop(queue) == Some(1)
146+ * assert Queue.pop(queue) == None
147+ *
114148 * @since v0.6.0
115149 */
116150provide let pop = queue => {
@@ -125,12 +159,60 @@ provide let pop = queue => {
125159 }
126160}
127161
162+ /**
163+ * Clears the queue by removing all of its elements.
164+ *
165+ * @param queue: The queue to clear
166+ *
167+ * @example
168+ * let queue = Queue.make()
169+ * Queue.push(1, queue)
170+ * assert Queue.size(queue) == 1
171+ * Queue.clear(queue)
172+ * assert Queue.size(queue) == 0
173+ *
174+ * @since v0.6.0
175+ */
176+ provide let clear = queue => {
177+ queue.size = 0
178+ Array.fill(None, queue.array)
179+ queue.headIndex = 0
180+ queue.tailIndex = 0
181+ }
182+
183+ /**
184+ * Produces a shallow copy of the input queue.
185+ *
186+ * @param queue: The queue to copy
187+ * @returns A new queue containing the elements from the input
188+ *
189+ * @example
190+ * let queue = Queue.make()
191+ * Queue.push(1, queue)
192+ * let copiedQueue = Queue.copy(queue)
193+ * Queue.push(2, queue) // Does not affect copiedQueue
194+ * assert Queue.pop(copiedQueue) == Some(1)
195+ *
196+ * @since v0.6.0
197+ */
198+ provide let copy = queue => {
199+ let { size, array, headIndex, tailIndex } = queue
200+ { size, array: Array.copy(array), headIndex, tailIndex }
201+ }
202+
128203/**
129204 * Converts a queue into a list of its elements.
130205 *
131206 * @param queue: The queue to convert
132207 * @returns A list containing all queue values
133208 *
209+ * @example
210+ * let queue = Queue.make()
211+ * Queue.push(0, queue)
212+ * Queue.push(1, queue)
213+ * Queue.push(2, queue)
214+ * assert Queue.toList(queue) == [0, 1, 2]
215+ *
134216 * @since v0.6.0
135217 */
136218provide let toList = queue => {
@@ -152,6 +234,11 @@ provide let toList = queue => {
152234 * @param list: The list to convert
153235 * @returns A queue containing all list values
154236 *
237+ * @example
238+ * let queue = Queue.fromList([0, 1])
239+ * assert Queue.pop(queue) == Some(0)
240+ * assert Queue.pop(queue) == Some(1)
241+ *
155242 * @since v0.6.0
156243 */
157244provide let fromList = list => {
@@ -160,39 +247,19 @@ provide let fromList = list => {
160247 queue
161248}
162249
163- /**
164- * Clears the queue by removing all of its elements
165- *
166- * @param queue: The queue to clear
167- *
168- * @since v0.6.0
169- */
170- provide let clear = queue => {
171- queue.size = 0
172- Array.fill(None, queue.array)
173- queue.headIndex = 0
174- queue.tailIndex = 0
175- }
176-
177- /**
178- * Produces a shallow copy of the input queue.
179- *
180- * @param queue: The queue to copy
181- * @returns A new queue containing the elements from the input
182- *
183- * @since v0.6.0
184- */
185- provide let copy = queue => {
186- let { size, array, headIndex, tailIndex } = queue
187- { size, array: Array.copy(array), headIndex, tailIndex }
188- }
189-
190250/**
191251 * Converts a queue into an array of its values.
192252 *
193253 * @param queue: The queue to convert
194254 * @returns An array containing all values from the given queue
195255 *
256+ * @example
257+ * let queue = Queue.make()
258+ * Queue.push(0, queue)
259+ * Queue.push(1, queue)
260+ * Queue.push(2, queue)
261+ * assert Queue.toArray(queue) == [> 0, 1, 2]
262+ *
196263 * @since v0.6.0
197264 */
198265provide let toArray = queue => {
@@ -230,6 +297,11 @@ provide let toArray = queue => {
230297 * @param arr: The array to convert
231298 * @returns A queue containing all values from the array
232299 *
300+ * @example
301+ * let queue = Queue.fromArray([> 0, 1])
302+ * assert Queue.pop(queue) == Some(0)
303+ * assert Queue.pop(queue) == Some(1)
304+ *
233305 * @since v0.6.0
234306 */
235307provide let fromArray = arr => {
@@ -255,6 +327,18 @@ provide let fromArray = arr => {
255327 * @param queue2: The second queue to compare
256328 * @returns `true` if the queues are equivalent or `false` otherwise
257329 *
330+ * @example
331+ * use Queue.{ (==) }
332+ * let queue1 = Queue.fromList([0, 1, 2])
333+ * let queue2 = Queue.fromList([0, 1, 2])
334+ * assert queue1 == queue2
335+ *
336+ * @example
337+ * use Queue.{ (==) }
338+ * let queue1 = Queue.fromList([0, 1, 2])
339+ * let queue2 = Queue.fromList([0, 1, 3])
340+ * assert !(queue1 == queue2)
341+ *
258342 * @since v0.6.0
259343 */
260344provide let (==) = (queue1, queue2) => {
@@ -276,10 +360,24 @@ provide let (==) = (queue1, queue2) => {
276360
277361/**
278362 * An immutable queue implementation.
363+ *
364+ * @example
365+ * let queue = Immutable.Queue.fromList([0, 1])
366+ * let queue = Immutable.Queue.push(2, queue)
367+ * assert Immutable.Queue.peek(queue) == Some(0)
368+ * let queue = Immutable.Queue.pop(queue)
369+ * assert Immutable.Queue.peek(queue) == Some(1)
370+ * ignore(Queue.Immutable.pop(queue)) // Does not affect the original queue
371+ * assert Immutable.Queue.peek(queue) == Some(1)
372+ *
373+ * @since v0.6.0
279374 */
280375provide module Immutable {
281376 /**
282377 * An immutable FIFO (first-in-first-out) data structure.
378+ *
379+ * @since v0.6.0
380+ * @history v0.5.4: Originally a module root API
283381 */
284382 abstract record ImmutableQueue<a> {
285383 forwards: List<a>,
@@ -289,6 +387,10 @@ provide module Immutable {
289387 /**
290388 * An empty queue.
291389 *
390+ * @example
391+ * let queue = Queue.Immutable.empty
392+ * assert Queue.Immutable.isEmpty(queue)
393+ *
292394 * @since v0.6.0
293395 * @history v0.5.4: Originally a module root API
294396 */
@@ -303,6 +405,10 @@ provide module Immutable {
303405 * @param queue: The queue to check
304406 * @returns `true` if the given queue is empty or `false` otherwise
305407 *
408+ * @example Queue.Immutable.isEmpty(Queue.Immutable.empty) == true
409+ *
410+ * @example Queue.Immutable.isEmpty(Queue.Immutable.fromList([1, 2])) == false
411+ *
306412 * @since v0.6.0
307413 * @history v0.2.0: Originally a module root API
308414 */
@@ -319,6 +425,14 @@ provide module Immutable {
319425 * @param queue: The queue to inspect
320426 * @returns `Some(value)` containing the value at the beginning of the queue, or `None` if the queue is empty
321427 *
428+ * @example
429+ * let queue = Queue.Immutable.fromList([1, 2, 3])
430+ * assert Queue.Immutable.peek(queue) == Some(1)
431+ *
432+ * @example
433+ * let queue = Queue.Immutable.empty
434+ * assert Queue.Immutable.peek(queue) == None
435+ *
322436 * @since v0.6.0
323437 * @history v0.2.0: Originally named `head`
324438 * @history v0.3.2: Deprecated `head` function
@@ -339,6 +453,12 @@ provide module Immutable {
339453 * @param queue: The queue to update
340454 * @returns An updated queue
341455 *
456+ * @example
457+ * let queue = Queue.Immutable.fromList([1])
458+ * assert Queue.Immutable.size(queue) == 1
459+ * let queue = Queue.Immutable.push(2, queue)
460+ * assert Queue.Immutable.size(queue) == 2
461+ *
342462 * @since v0.6.0
343463 * @history v0.2.0: Originally named `enqueue`
344464 * @history v0.3.2: Deprecated `enqueue` function
@@ -358,6 +478,16 @@ provide module Immutable {
358478 * @param queue: The queue to change
359479 * @returns An updated queue
360480 *
481+ * @example
482+ * let queue = Queue.Immutable.fromList([1, 2, 3])
483+ * let queue = Queue.Immutable.pop(queue)
484+ * assert Queue.Immutable.peek(queue) == Some(2)
485+ *
486+ * @example
487+ * let queue = Queue.Immutable.empty
488+ * let queue = Queue.Immutable.pop(queue)
489+ * assert Queue.Immutable.isEmpty(queue)
490+ *
361491 * @since v0.6.0
362492 * @history v0.2.0: Originally named `dequeue`
363493 * @history v0.3.2: Deprecated `dequeue` function
@@ -381,6 +511,9 @@ provide module Immutable {
381511 * @param queue: The queue to inspect
382512 * @returns The number of values in the queue
383513 *
514+ * @example Queue.Immutable.size(Queue.Immutable.empty) == 0
515+ * @example Queue.Immutable.size(Queue.Immutable.fromList([1, 2])) == 2
516+ *
384517 * @since v0.6.0
385518 * @history v0.3.2: Originally a module root API
386519 */
@@ -399,6 +532,20 @@ provide module Immutable {
399532 * @param queue: The queue to convert
400533 * @returns A list containing all queue values
401534 *
535+ * @example
536+ * let queue = Queue.Immutable.empty
537+ * let queue = Queue.Immutable.push(1, queue)
538+ * let queue = Queue.Immutable.push(2, queue)
539+ * assert Queue.Immutable.toList(queue) == [1, 2]
540+ *
541+ * @example
542+ * let queue = Queue.Immutable.fromList([1, 2, 3])
543+ * assert Queue.Immutable.toList(queue) == [1, 2, 3]
544+ *
545+ * @example
546+ * let queue = Queue.Immutable.empty
547+ * assert Queue.Immutable.toList(queue) == []
548+ *
402549 * @since v0.6.0
403550 */
404551 provide let toList = queue => {
@@ -411,6 +558,11 @@ provide module Immutable {
411558 * @param list: The list to convert
412559 * @returns A queue containing all list values
413560 *
561+ * @example
562+ * let queue = Queue.Immutable.fromList([1, 2, 3])
563+ * assert Queue.Immutable.peek(queue) == Some(1)
564+ * assert Queue.Immutable.size(queue) == 3
565+ *
414566 * @since v0.6.0
415567 */
416568 provide let fromList = list => {
0 commit comments