diff --git a/util/src/main/kotlin/org/openrs2/util/collect/UniqueQueue.kt b/util/src/main/kotlin/org/openrs2/util/collect/UniqueQueue.kt new file mode 100644 index 00000000..85ab246b --- /dev/null +++ b/util/src/main/kotlin/org/openrs2/util/collect/UniqueQueue.kt @@ -0,0 +1,25 @@ +package org.openrs2.util.collect + +public class UniqueQueue { + private val queue = ArrayDeque() + private val set = mutableSetOf() + + public fun add(v: T): Boolean { + if (set.add(v)) { + queue.addLast(v) + return true + } + + return false + } + + public fun poll(): T? { + val v = queue.removeFirstOrNull() + if (v != null) { + set.remove(v) + return v + } + + return null + } +} diff --git a/util/src/test/kotlin/org/openrs2/util/collect/UniqueQueueTest.kt b/util/src/test/kotlin/org/openrs2/util/collect/UniqueQueueTest.kt new file mode 100644 index 00000000..09302967 --- /dev/null +++ b/util/src/test/kotlin/org/openrs2/util/collect/UniqueQueueTest.kt @@ -0,0 +1,21 @@ +package org.openrs2.util.collect + +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNull +import kotlin.test.assertTrue + +class UniqueQueueTest { + @Test + fun testAddPoll() { + val queue = UniqueQueue() + assertTrue(queue.add("a")) + assertTrue(queue.add("b")) + assertFalse(queue.add("a")) + + assertEquals("a", queue.poll()) + assertEquals("b", queue.poll()) + assertNull(queue.poll()) + } +}