Skip to content

Commit 1179c91

Browse files
chore(stdlib): Add examples to Queue module (#2200)
Co-authored-by: Oscar Spencer <oscar.spen@gmail.com>
1 parent 551f5ad commit 1179c91

File tree

2 files changed

+457
-49
lines changed

2 files changed

+457
-49
lines changed

stdlib/queue.gr

Lines changed: 179 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@
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
*/
1219
module 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
*/
3848
provide 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
*/
5063
provide 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
*/
6076
provide 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
*/
7092
provide 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
*/
82110
provide 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
*/
116150
provide 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
*/
136218
provide 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
*/
157244
provide 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
*/
198265
provide 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
*/
235307
provide 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
*/
260344
provide 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
*/
280375
provide 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

Comments
 (0)