Skip to content

Commit

Permalink
better typings for lib0/queue
Browse files Browse the repository at this point in the history
  • Loading branch information
dmonad committed Sep 12, 2023
1 parent 41d8eac commit 1ccf826
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 25 deletions.
35 changes: 27 additions & 8 deletions queue.js
Expand Up @@ -7,14 +7,30 @@ export class QueueNode {
}
}

/**
* @template V
*/
export class QueueValue extends QueueNode {
/**
* @param {V} v
*/
constructor (v) {
super()
this.v = v
}
}

/**
* @template {QueueNode} N
*/
export class Queue {
constructor () {
/**
* @type {QueueNode | null}
* @type {N | null}
*/
this.start = null
/**
* @type {QueueNode | null}
* @type {N | null}
*/
this.end = null
}
Expand All @@ -24,18 +40,20 @@ export class Queue {
* @note The queue implementation is experimental and unfinished.
* Don't use this in production yet.
*
* @return {Queue}
* @template {QueueNode} N
* @return {Queue<N>}
*/
export const create = () => new Queue()

/**
* @param {Queue} queue
* @param {Queue<any>} queue
*/
export const isEmpty = queue => queue.start === null

/**
* @param {Queue} queue
* @param {QueueNode} n
* @template {Queue<any>} Q
* @param {Q} queue
* @param {Q extends Queue<infer N> ? N : never} n
*/
export const enqueue = (queue, n) => {
if (queue.end !== null) {
Expand All @@ -48,8 +66,9 @@ export const enqueue = (queue, n) => {
}

/**
* @param {Queue} queue
* @return {QueueNode | null}
* @template {QueueNode} N
* @param {Queue<N>} queue
* @return {N | null}
*/
export const dequeue = queue => {
const n = queue.start
Expand Down
24 changes: 7 additions & 17 deletions queue.test.js
@@ -1,43 +1,33 @@
import * as t from './testing.js'
import * as queue from './queue.js'

class QueueItem extends queue.QueueNode {
/**
* @param {number} v
*/
constructor (v) {
super()
this.v = v
}
}

/**
* @param {t.TestCase} tc
* @param {t.TestCase} _tc
*/
export const testEnqueueDequeue = tc => {
export const testEnqueueDequeue = _tc => {
const N = 30
/**
* @type {queue.Queue}
* @type {queue.Queue<queue.QueueValue<number>>}
*/
const q = queue.create()
t.assert(queue.isEmpty(q))
t.assert(queue.dequeue(q) === null)
for (let i = 0; i < N; i++) {
queue.enqueue(q, new QueueItem(i))
queue.enqueue(q, new queue.QueueValue(i))
t.assert(!queue.isEmpty(q))
}
for (let i = 0; i < N; i++) {
const item = /** @type {QueueItem} */ (queue.dequeue(q))
const item = queue.dequeue(q)
t.assert(item !== null && item.v === i)
}
t.assert(queue.isEmpty(q))
t.assert(queue.dequeue(q) === null)
for (let i = 0; i < N; i++) {
queue.enqueue(q, new QueueItem(i))
queue.enqueue(q, new queue.QueueValue(i))
t.assert(!queue.isEmpty(q))
}
for (let i = 0; i < N; i++) {
const item = /** @type {QueueItem} */ (queue.dequeue(q))
const item = queue.dequeue(q)
t.assert(item !== null && item.v === i)
}
t.assert(queue.isEmpty(q))
Expand Down

0 comments on commit 1ccf826

Please sign in to comment.