Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(stdlib): Add == operator to Queue module #1931

Merged
merged 3 commits into from
Jan 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions compiler/test/stdlib/queue.test.gr
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,74 @@ Queue.push(4, qa1)
assert Queue.fromArray([> 1, 2, 3, 4]) == qa1
assert Queue.fromArray([>]) == Queue.makeSized(16)

// Queue.equal
from Queue use { (==) }
let queue1 = Queue.make()
let queue2 = Queue.make()
Queue.push(1, queue2)
Queue.push(2, queue2)
Queue.push(3, queue2)
Queue.push(4, queue2)
Queue.pop(queue2)
Queue.pop(queue2)
Queue.push(5, queue2)
Queue.pop(queue2)
Queue.pop(queue2)
Queue.pop(queue2)
Queue.push(6, queue2)
Queue.push(7, queue2)
Queue.push(8, queue2)
Queue.push(9, queue2)
Queue.push(10, queue2)
Queue.push(11, queue2)
Queue.push(12, queue2)
Queue.push(13, queue2)
Queue.push(14, queue2)
Queue.push(15, queue2)
Queue.push(16, queue2)
Queue.push(17, queue2)
Queue.push(18, queue2)
Queue.push(19, queue2)
let queue3 = Queue.make()
Queue.push(1, queue3)
Queue.push(2, queue3)
Queue.push(3, queue3)
let queue4 = Queue.copy(queue3)
Queue.pop(queue4)
let queue5 = Queue.make()
Queue.push(6, queue5)
Queue.push(7, queue5)
Queue.push(8, queue5)
Queue.push(9, queue5)
Queue.push(10, queue5)
Queue.push(11, queue5)
Queue.push(12, queue5)
Queue.push(13, queue5)
Queue.push(14, queue5)
Queue.push(15, queue5)
Queue.push(16, queue5)
Queue.push(17, queue5)
Queue.push(18, queue5)
Queue.push(19, queue5)
assert queue2 == queue5
let queue6 = Queue.make()
Queue.push(1, queue6)
Queue.push(2, queue6)
Queue.push(3, queue6)
assert queue3 == queue6
let queue7 = Queue.make()
Queue.push(2, queue7)
Queue.push(3, queue7)
assert queue4 == queue7
let queue8 = Queue.make()
Queue.push(1, queue8)
Queue.pop(queue8)
assert queue8 == queue1

assert !(queue2 == queue3)
assert !(queue5 == queue6)
from Pervasives use { (==) }

module Immutable {
from Queue use { module Immutable as Queue }

Expand Down
26 changes: 26 additions & 0 deletions stdlib/queue.gr
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,32 @@ provide let fromArray = arr => {
{ size, array: contents, headIndex: 0, tailIndex: size }
}

/**
* Checks if two queues are equivalent by value.
*
* @param queue1: The first queue to compare
* @param queue2: The second queue to compare
* @returns `true` if the queues are equivalent or `false` otherwise
*
* @since v0.6.0
*/
provide let (==) = (queue1, queue2) => {
if (queue1.size != queue2.size) return false
let len1 = Array.length(queue1.array)
let len2 = Array.length(queue2.array)
for (let mut i = 0; i < queue1.size; i += 1) {
// Get the index of element from queue1
let mut index1 = queue1.headIndex + i
if (index1 >= len1) index1 -= len1
// Get the index of element from queue2
let mut index2 = queue2.headIndex + i
if (index2 >= len2) index2 -= len2

if (queue1.array[index1] != queue2.array[index2]) return false
}
return true
}

/**
* An immutable queue implementation.
*/
Expand Down
26 changes: 26 additions & 0 deletions stdlib/queue.md
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,32 @@ Returns:
|----|-----------|
|`Queue<a>`|A queue containing all values from the array|

### Queue.**(==)**

<details disabled>
<summary tabindex="-1">Added in <code>next</code></summary>
No other changes yet.
</details>

```grain
(==) : (queue1: Queue<a>, queue2: Queue<a>) => Bool
```

Checks if two queues are equivalent by value.

Parameters:

|param|type|description|
|-----|----|-----------|
|`queue1`|`Queue<a>`|The first queue to compare|
|`queue2`|`Queue<a>`|The second queue to compare|

Returns:

|type|description|
|----|-----------|
|`Bool`|`true` if the queues are equivalent or `false` otherwise|

## Queue.Immutable

An immutable queue implementation.
Expand Down
Loading