
On a simple benchmark of: (let ([N 100000] [M 20] [q (make-queue)]) (time (for ([i (in-range M)]) (for ([i (in-range (* i N))]) (enqueue! q i)) (unless (for/and ([i (in-range (* i N))]) (list i (dequeue! q))) (error "poof"))))) I get these timings: original version: cpu time: 24438 real time: 24439 gc time: 8164 single-links: cpu time: 17848 real time: 17849 gc time: 4859 this version: cpu time: 6519 real time: 6519 gc time: 3032 In addition, cleaned up the documentation a little, and mention the fact that it is not thread safe.
64 lines
1.4 KiB
Racket
64 lines
1.4 KiB
Racket
#lang scribble/manual
|
|
@(require scribble/eval "utils.rkt" (for-label racket unstable/queue))
|
|
@(define qeval (eval/require 'unstable/queue))
|
|
|
|
@title{Imperative Queues}
|
|
|
|
@defmodule[unstable/queue]
|
|
|
|
@unstable[@author+email["Carl Eastlund" "cce@racket-lang.org"]]
|
|
|
|
This module provides a simple mutable queue representation,
|
|
first-in/first-out only. Operations on queues mutate it in a
|
|
thread-unsafe way.
|
|
|
|
@defproc[(make-queue) queue/c]{
|
|
Produces an empty queue.
|
|
}
|
|
|
|
@defproc[(enqueue! [q queue/c] [v any/c]) void?]{
|
|
Adds an element to the back of a queue.
|
|
}
|
|
|
|
@defproc[(dequeue! [q nonempty-queue/c]) any/c]{
|
|
Removes an element from the front of a nonempty queue, and returns that
|
|
element.
|
|
|
|
@defexamples[#:eval qeval
|
|
(define q (make-queue))
|
|
(enqueue! q 1)
|
|
(dequeue! q)
|
|
(enqueue! q 2)
|
|
(enqueue! q 3)
|
|
(dequeue! q)
|
|
(dequeue! q)]
|
|
}
|
|
|
|
@defproc[(queue-empty? [q queue/c]) boolean?]{
|
|
Recognizes whether a queue is empty or not.
|
|
|
|
@defexamples[#:eval qeval
|
|
(define q (make-queue))
|
|
(queue-empty? q)
|
|
(enqueue! q 1)
|
|
(queue-empty? q)
|
|
(dequeue! q)
|
|
(queue-empty? q)]
|
|
}
|
|
|
|
@defproc[(queue? [v any/c]) boolean?]{
|
|
This predicate recognizes queues.
|
|
|
|
@defexamples[#:eval qeval
|
|
(queue? (make-queue))
|
|
(queue? 'not-a-queue)]
|
|
}
|
|
|
|
@deftogether[(
|
|
@defthing[queue/c flat-contract?]
|
|
@defthing[nonempty-queue/c flat-contract?]
|
|
)]{
|
|
These contracts recognize queues; the latter requires the queue to
|
|
contain at least one value.
|
|
}
|