racket/collects/unstable/scribblings/queue.scrbl
Eli Barzilay 3f36d054f6 Turn contracts on enqueue!' and dequeue!' into the usual error checks.
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.
2010-06-23 16:13:54 -04:00

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.
}