diff --git a/compiler/test/stdlib/queue.test.gr b/compiler/test/stdlib/queue.test.gr
index 9a92554beb..1670e8a068 100644
--- a/compiler/test/stdlib/queue.test.gr
+++ b/compiler/test/stdlib/queue.test.gr
@@ -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 }
diff --git a/stdlib/queue.gr b/stdlib/queue.gr
index 26063ef73e..d76442b732 100644
--- a/stdlib/queue.gr
+++ b/stdlib/queue.gr
@@ -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.
*/
diff --git a/stdlib/queue.md b/stdlib/queue.md
index 810b6b5137..619d37649b 100644
--- a/stdlib/queue.md
+++ b/stdlib/queue.md
@@ -294,6 +294,32 @@ Returns:
|----|-----------|
|`Queue`|A queue containing all values from the array|
+### Queue.**(==)**
+
+
+Added in next
+No other changes yet.
+
+
+```grain
+(==) : (queue1: Queue, queue2: Queue) => Bool
+```
+
+Checks if two queues are equivalent by value.
+
+Parameters:
+
+|param|type|description|
+|-----|----|-----------|
+|`queue1`|`Queue`|The first queue to compare|
+|`queue2`|`Queue`|The second queue to compare|
+
+Returns:
+
+|type|description|
+|----|-----------|
+|`Bool`|`true` if the queues are equivalent or `false` otherwise|
+
## Queue.Immutable
An immutable queue implementation.