Skip to content

Commit 7cdcf95

Browse files
spotandjakephated
andauthored
feat(stdlib): Add toList and fromList functions to Queue module (#1866)
Co-authored-by: Blaine Bublitz <blaine.bublitz@gmail.com>
1 parent 0ed3926 commit 7cdcf95

File tree

3 files changed

+205
-0
lines changed

3 files changed

+205
-0
lines changed

compiler/test/stdlib/queue.test.gr

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,32 @@ let queue2 = Queue.makeSized(1)
5353
Queue.push(0, queue2)
5454
assert queue == queue2
5555

56+
// Queue.toList
57+
let queue = Queue.makeSized(3)
58+
assert Queue.toList(queue) == []
59+
Queue.push(0, queue)
60+
Queue.push(1, queue)
61+
Queue.push(2, queue)
62+
Queue.push(3, queue)
63+
assert Queue.toList(queue) == [0, 1, 2, 3]
64+
Queue.pop(queue)
65+
assert Queue.toList(queue) == [1, 2, 3]
66+
Queue.push(3, queue)
67+
assert Queue.toList(queue) == [1, 2, 3, 3]
68+
Queue.pop(queue)
69+
Queue.push(4, queue)
70+
Queue.push(5, queue)
71+
assert Queue.toList(queue) == [2, 3, 3, 4, 5]
72+
73+
// Queue.fromList
74+
let queue = Queue.makeSized(0)
75+
assert Queue.fromList([]) == queue
76+
Queue.push(0, queue)
77+
Queue.push(1, queue)
78+
Queue.push(2, queue)
79+
Queue.push(3, queue)
80+
assert Queue.fromList([0, 1, 2, 3]) == queue
81+
5682
// test that the "circular" behavior of the circular queue works as expected
5783
let queue = Queue.makeSized(4)
5884
let push = x => () => Queue.push(x, queue)
@@ -237,4 +263,24 @@ module Immutable {
237263
assert Queue.size(Queue.empty) == 0
238264
assert Queue.size(sampleQueue) == 3
239265
assert Queue.size(Queue.pop(Queue.pop(sampleQueue))) == 1
266+
267+
// Queue.toList
268+
let sampleQueue = Queue.push(3, Queue.push(2, Queue.push(1, Queue.empty)))
269+
assert Queue.toList(Queue.empty) == []
270+
assert Queue.toList(sampleQueue) == [1, 2, 3]
271+
assert Queue.toList(Queue.pop(sampleQueue)) == [2, 3]
272+
273+
// Queue.fromList
274+
assert Queue.fromList([]) == Queue.empty
275+
let queue = Queue.fromList([1, 2, 3])
276+
assert Queue.peek(sampleQueue) == Queue.peek(queue)
277+
let queue = Queue.pop(queue)
278+
let sampleQueue = Queue.pop(sampleQueue)
279+
assert Queue.peek(sampleQueue) == Queue.peek(queue)
280+
let queue = Queue.pop(queue)
281+
let sampleQueue = Queue.pop(sampleQueue)
282+
assert Queue.peek(sampleQueue) == Queue.peek(queue)
283+
let queue = Queue.pop(queue)
284+
let sampleQueue = Queue.pop(sampleQueue)
285+
assert Queue.peek(sampleQueue) == Queue.peek(queue)
240286
}

stdlib/queue.gr

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,39 @@ provide let pop = queue => {
137137
}
138138
}
139139

140+
/**
141+
* Converts a queue into a list of its elements.
142+
*
143+
* @param queue: The queue to convert
144+
* @returns A list containing all queue values
145+
*
146+
* @since v0.6.0
147+
*/
148+
provide let toList = queue => {
149+
let lst = List.init(queue.size, i => match (queue.array[(queue.headIndex +
150+
i) %
151+
Array.length(queue.array)]) {
152+
Some(n) => n,
153+
None =>
154+
fail "Impossible: Attempted to access non-existent bucket in Queue.toList",
155+
})
156+
lst
157+
}
158+
159+
/**
160+
* Creates a queue from a list.
161+
*
162+
* @param list: The list to convert
163+
* @returns A queue containing all list values
164+
*
165+
* @since v0.6.0
166+
*/
167+
provide let fromList = list => {
168+
let queue = makeSized(List.length(list))
169+
List.forEach(e => push(e, queue), list)
170+
queue
171+
}
172+
140173
/**
141174
* Clears the queue by removing all of its elements
142175
*
@@ -382,4 +415,30 @@ provide module Immutable {
382415
{ forwards, backwards } => List.length(forwards) + List.length(backwards),
383416
}
384417
}
418+
419+
/**
420+
* Converts a queue into a list of its elements.
421+
*
422+
* @param queue: The queue to convert
423+
* @returns A list containing all queue values
424+
*
425+
* @since v0.6.0
426+
*/
427+
428+
provide let toList = queue => {
429+
List.append(queue.forwards, List.reverse(queue.backwards))
430+
}
431+
432+
/**
433+
* Creates a queue from a list.
434+
*
435+
* @param list: The list to convert
436+
* @returns A queue containing all list values
437+
*
438+
* @since v0.6.0
439+
*/
440+
441+
provide let fromList = list => {
442+
{ forwards: list, backwards: [] }
443+
}
385444
}

stdlib/queue.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,56 @@ Returns:
200200
|----|-----------|
201201
|`Option<a>`|The element removed from the queue|
202202

203+
### Queue.**toList**
204+
205+
<details disabled>
206+
<summary tabindex="-1">Added in <code>next</code></summary>
207+
No other changes yet.
208+
</details>
209+
210+
```grain
211+
toList : (queue: Queue<a>) => List<a>
212+
```
213+
214+
Converts a queue into a list of its elements.
215+
216+
Parameters:
217+
218+
|param|type|description|
219+
|-----|----|-----------|
220+
|`queue`|`Queue<a>`|The queue to convert|
221+
222+
Returns:
223+
224+
|type|description|
225+
|----|-----------|
226+
|`List<a>`|A list containing all queue values|
227+
228+
### Queue.**fromList**
229+
230+
<details disabled>
231+
<summary tabindex="-1">Added in <code>next</code></summary>
232+
No other changes yet.
233+
</details>
234+
235+
```grain
236+
fromList : (list: List<a>) => Queue<a>
237+
```
238+
239+
Creates a queue from a list.
240+
241+
Parameters:
242+
243+
|param|type|description|
244+
|-----|----|-----------|
245+
|`list`|`List<a>`|The list to convert|
246+
247+
Returns:
248+
249+
|type|description|
250+
|----|-----------|
251+
|`Queue<a>`|A queue containing all list values|
252+
203253
### Queue.**clear**
204254

205255
<details disabled>
@@ -530,3 +580,53 @@ Returns:
530580
|----|-----------|
531581
|`Number`|The number of values in the queue|
532582

583+
#### Queue.Immutable.**toList**
584+
585+
<details disabled>
586+
<summary tabindex="-1">Added in <code>next</code></summary>
587+
No other changes yet.
588+
</details>
589+
590+
```grain
591+
toList : (queue: ImmutableQueue<a>) => List<a>
592+
```
593+
594+
Converts a queue into a list of its elements.
595+
596+
Parameters:
597+
598+
|param|type|description|
599+
|-----|----|-----------|
600+
|`queue`|`ImmutableQueue<a>`|The queue to convert|
601+
602+
Returns:
603+
604+
|type|description|
605+
|----|-----------|
606+
|`List<a>`|A list containing all queue values|
607+
608+
#### Queue.Immutable.**fromList**
609+
610+
<details disabled>
611+
<summary tabindex="-1">Added in <code>next</code></summary>
612+
No other changes yet.
613+
</details>
614+
615+
```grain
616+
fromList : (list: List<a>) => ImmutableQueue<a>
617+
```
618+
619+
Creates a queue from a list.
620+
621+
Parameters:
622+
623+
|param|type|description|
624+
|-----|----|-----------|
625+
|`list`|`List<a>`|The list to convert|
626+
627+
Returns:
628+
629+
|type|description|
630+
|----|-----------|
631+
|`ImmutableQueue<a>`|A queue containing all list values|
632+

0 commit comments

Comments
 (0)